From b788f376f7ab15875118cb392b1908a8e9af83d5 Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Sun, 10 Nov 2019 13:19:57 +0800 Subject: [PATCH] riscv64,exec: add amoand --- src/isa/riscv64/exec/all-instr.h | 1 + src/isa/riscv64/exec/amo.c | 29 ++++++++++++++--------------- src/isa/riscv64/exec/exec.c | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/isa/riscv64/exec/all-instr.h b/src/isa/riscv64/exec/all-instr.h index 4141d0cc..0d8b8d36 100644 --- a/src/isa/riscv64/exec/all-instr.h +++ b/src/isa/riscv64/exec/all-instr.h @@ -57,3 +57,4 @@ make_EHelper(sc); make_EHelper(amoswap); make_EHelper(amoadd); make_EHelper(amoor); +make_EHelper(amoand); diff --git a/src/isa/riscv64/exec/amo.c b/src/isa/riscv64/exec/amo.c index abe8d839..8ecbc267 100644 --- a/src/isa/riscv64/exec/amo.c +++ b/src/isa/riscv64/exec/amo.c @@ -25,37 +25,36 @@ make_EHelper(sc) { print_asm_template3(sc); } -make_EHelper(amoswap) { +static void inline amo_load() { rtl_lm(&s0, &id_src->val, decinfo.width); rtl_sext(&s0, &s0, decinfo.width); rtl_sr(id_dest->reg, &s0, 0); +} - // swap +make_EHelper(amoswap) { + amo_load(); + //swap rtl_sm(&id_src->val, &id_src2->val, decinfo.width); - print_asm_template3(amoswap); } make_EHelper(amoadd) { - rtl_lm(&s0, &id_src->val, decinfo.width); - rtl_sext(&s0, &s0, decinfo.width); - rtl_sr(id_dest->reg, &s0, 0); - - // add + amo_load(); rtl_add(&s0, &s0, &id_src2->val); rtl_sm(&id_src->val, &s0, decinfo.width); - print_asm_template3(amoor); } make_EHelper(amoor) { - rtl_lm(&s0, &id_src->val, decinfo.width); - rtl_sext(&s0, &s0, decinfo.width); - rtl_sr(id_dest->reg, &s0, 0); - - // or + amo_load(); rtl_or(&s0, &s0, &id_src2->val); rtl_sm(&id_src->val, &s0, decinfo.width); - print_asm_template3(amoor); } + +make_EHelper(amoand) { + amo_load(); + rtl_and(&s0, &s0, &id_src2->val); + rtl_sm(&id_src->val, &s0, decinfo.width); + print_asm_template3(amoand); +} diff --git a/src/isa/riscv64/exec/exec.c b/src/isa/riscv64/exec/exec.c index 3c643f73..5bf71d1f 100644 --- a/src/isa/riscv64/exec/exec.c +++ b/src/isa/riscv64/exec/exec.c @@ -70,7 +70,7 @@ static make_EHelper(atomic) { EMPTY, EX(amoswap), EX(lr), EX(sc) }; static OpcodeEntry table_hi [8] = { - EX(amoadd), EMPTY, EX(amoor), EMPTY, EMPTY, EMPTY, EMPTY, EMPTY + EX(amoadd), EMPTY, EX(amoor), EX(amoand), EMPTY, EMPTY, EMPTY, EMPTY }; decinfo.width = 1 << decinfo.isa.instr.funct3; -- GitLab