diff --git a/src/isa/riscv64/exec/all-instr.h b/src/isa/riscv64/exec/all-instr.h index 4141d0ccf51ae88f491e9da7594d28be38bccdc3..0d8b8d36fa02e1172156bde52944c5af42a3dfe2 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 abe8d839c071099af333e80e2ee28f98952ac2ad..8ecbc267391f397f4d86f640582181a2c7ebd77e 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 3c643f73073b8361f62b4f6034668cd86ac8da2f..5bf71d1fa11abf35ab0b073315d54ffc9c5caf83 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;