Browse Source
also refine writing path to RD Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>pull/2310/head
8 changed files with 32 additions and 25 deletions
@ -1,5 +1,8 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
reg_t tmp = (reg_t)P_RS1_PAIR >> insn.shamtd(); |
reg_t tmp = (reg_t)P_RS1_PAIR >> insn.shamtd(); |
||||
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); |
if (tmp > UINT32_MAX) { |
||||
WRITE_RD(result); |
tmp = UINT32_MAX; |
||||
|
P.set_vxsat(); |
||||
|
} |
||||
|
WRITE_RD(sext32(tmp)); |
||||
|
|||||
@ -1,11 +1,11 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
reg_t val = (reg_t)P_RS1_PAIR; |
|
||||
uint32_t shamt = insn.shamtd(); |
uint32_t shamt = insn.shamtd(); |
||||
reg_t result; |
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1; |
||||
if (shamt == 0) { |
|
||||
result = P_USAT_FULL(32, (sreg_t)val); |
if (tmp > UINT32_MAX) { |
||||
} else { |
tmp = UINT32_MAX; |
||||
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); |
P.set_vxsat(); |
||||
} |
} |
||||
WRITE_RD(result); |
WRITE_RD(sext32(tmp)); |
||||
|
|
||||
|
|||||
@ -1,11 +1,11 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
reg_t val = (reg_t)P_RS1_PAIR; |
|
||||
uint32_t shamt = RS2 & 0x3f; |
uint32_t shamt = RS2 & 0x3f; |
||||
reg_t result; |
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1; |
||||
if (shamt == 0) { |
|
||||
result = P_USAT_FULL(32, (sreg_t)val); |
if (tmp > UINT32_MAX) { |
||||
} else { |
tmp = UINT32_MAX; |
||||
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); |
P.set_vxsat(); |
||||
} |
} |
||||
WRITE_RD(result); |
WRITE_RD(sext32(tmp)); |
||||
|
|
||||
|
|||||
@ -1,5 +1,9 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
reg_t tmp = (reg_t)P_RS1_PAIR >> (RS2 & 0x3f); |
reg_t tmp = (reg_t)P_RS1_PAIR >> (RS2 & 0x3f); |
||||
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); |
if (tmp > UINT32_MAX) { |
||||
WRITE_RD(result); |
tmp = UINT32_MAX; |
||||
|
P.set_vxsat(); |
||||
|
} |
||||
|
|
||||
|
WRITE_RD(sext32(tmp)); |
||||
|
|||||
Loading…
Reference in new issue