Browse Source

rvp: helper macro doesn't fit some nclip operation

also refine writing path to RD

Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
pull/2310/head
Chih-Min Chao 3 months ago
parent
commit
59b63cf58d
  1. 2
      riscv/insns/nclip.h
  2. 2
      riscv/insns/nclipi.h
  3. 7
      riscv/insns/nclipiu.h
  4. 2
      riscv/insns/nclipr.h
  5. 6
      riscv/insns/nclipri.h
  6. 14
      riscv/insns/nclipriu.h
  7. 14
      riscv/insns/nclipru.h
  8. 8
      riscv/insns/nclipu.h

2
riscv/insns/nclip.h

@ -2,4 +2,4 @@ require_extension('P');
require_rv32;
sreg_t tmp = (sreg_t)P_RS1_PAIR >> (RS2 & 0x3f);
int32_t result = P_SAT(32, tmp);
WRITE_RD(result);
WRITE_RD(sext32(result));

2
riscv/insns/nclipi.h

@ -2,4 +2,4 @@ require_extension('P');
require_rv32;
sreg_t tmp = (sreg_t)P_RS1_PAIR >> insn.shamtd();
int32_t result = P_SAT(32, tmp);
WRITE_RD(result);
WRITE_RD(sext32(result));

7
riscv/insns/nclipiu.h

@ -1,5 +1,8 @@
require_extension('P');
require_rv32;
reg_t tmp = (reg_t)P_RS1_PAIR >> insn.shamtd();
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp);
WRITE_RD(result);
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(sext32(tmp));

2
riscv/insns/nclipr.h

@ -8,4 +8,4 @@ if (shamt == 0) {
} else {
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
}
WRITE_RD(result);
WRITE_RD(sext32(result));

6
riscv/insns/nclipri.h

@ -4,8 +4,8 @@ sreg_t val = (sreg_t)P_RS1_PAIR;
uint32_t shamt = insn.shamtd();
sreg_t result;
if (shamt == 0) {
result = P_SAT(32, val);
result = P_SAT(32, val);
} else {
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
}
WRITE_RD(result);
WRITE_RD(sext32(result));

14
riscv/insns/nclipriu.h

@ -1,11 +1,11 @@
require_extension('P');
require_rv32;
reg_t val = (reg_t)P_RS1_PAIR;
uint32_t shamt = insn.shamtd();
reg_t result;
if (shamt == 0) {
result = P_USAT_FULL(32, (sreg_t)val);
} else {
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1)));
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1;
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(result);
WRITE_RD(sext32(tmp));

14
riscv/insns/nclipru.h

@ -1,11 +1,11 @@
require_extension('P');
require_rv32;
reg_t val = (reg_t)P_RS1_PAIR;
uint32_t shamt = RS2 & 0x3f;
reg_t result;
if (shamt == 0) {
result = P_USAT_FULL(32, (sreg_t)val);
} else {
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1)));
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1;
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(result);
WRITE_RD(sext32(tmp));

8
riscv/insns/nclipu.h

@ -1,5 +1,9 @@
require_extension('P');
require_rv32;
reg_t tmp = (reg_t)P_RS1_PAIR >> (RS2 & 0x3f);
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp);
WRITE_RD(result);
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(sext32(tmp));

Loading…
Cancel
Save