mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
Hexagon (target/hexagon) circular addressing
The following instructions are added L2_loadrub_pci Rd32 = memub(Rx32++#s4:0:circ(Mu2)) L2_loadrb_pci Rd32 = memb(Rx32++#s4:0:circ(Mu2)) L2_loadruh_pci Rd32 = memuh(Rx32++#s4:1:circ(Mu2)) L2_loadrh_pci Rd32 = memh(Rx32++#s4:1:circ(Mu2)) L2_loadri_pci Rd32 = memw(Rx32++#s4:2:circ(Mu2)) L2_loadrd_pci Rdd32 = memd(Rx32++#s4:3:circ(Mu2)) S2_storerb_pci memb(Rx32++#s4:0:circ(Mu2)) = Rt32 S2_storerh_pci memh(Rx32++#s4:1:circ(Mu2)) = Rt32 S2_storerf_pci memh(Rx32++#s4:1:circ(Mu2)) = Rt.H32 S2_storeri_pci memw(Rx32++#s4:2:circ(Mu2)) = Rt32 S2_storerd_pci memd(Rx32++#s4:3:circ(Mu2)) = Rtt32 S2_storerbnew_pci memb(Rx32++#s4:0:circ(Mu2)) = Nt8.new S2_storerhnew_pci memw(Rx32++#s4:1:circ(Mu2)) = Nt8.new S2_storerinew_pci memw(Rx32++#s4:2:circ(Mu2)) = Nt8.new L2_loadrub_pcr Rd32 = memub(Rx32++I:circ(Mu2)) L2_loadrb_pcr Rd32 = memb(Rx32++I:circ(Mu2)) L2_loadruh_pcr Rd32 = memuh(Rx32++I:circ(Mu2)) L2_loadrh_pcr Rd32 = memh(Rx32++I:circ(Mu2)) L2_loadri_pcr Rd32 = memw(Rx32++I:circ(Mu2)) L2_loadrd_pcr Rdd32 = memd(Rx32++I:circ(Mu2)) S2_storerb_pcr memb(Rx32++I:circ(Mu2)) = Rt32 S2_storerh_pcr memh(Rx32++I:circ(Mu2)) = Rt32 S2_storerf_pcr memh(Rx32++I:circ(Mu2)) = Rt32.H32 S2_storeri_pcr memw(Rx32++I:circ(Mu2)) = Rt32 S2_storerd_pcr memd(Rx32++I:circ(Mu2)) = Rtt32 S2_storerbnew_pcr memb(Rx32++I:circ(Mu2)) = Nt8.new S2_storerhnew_pcr memh(Rx32++I:circ(Mu2)) = Nt8.new S2_storerinew_pcr memw(Rx32++I:circ(Mu2)) = Nt8.new Test cases in tests/tcg/hexagon/circ.c Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <1617930474-31979-23-git-send-email-tsimpson@quicinc.com> [rth: Squash <1619667142-29636-1-git-send-email-tsimpson@quicinc.com> removing gen_read_reg and gen_set_byte to avoid clang Werror.] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
57d352ac29
commit
46ef47e2a7
9 changed files with 834 additions and 23 deletions
|
@ -251,33 +251,25 @@ void HELPER(debug_commit_end)(CPUHexagonState *env, int has_st0, int has_st1)
|
|||
|
||||
}
|
||||
|
||||
static int32_t fcircadd_v4(int32_t RxV, int32_t offset, int32_t M, int32_t CS)
|
||||
{
|
||||
int32_t length = M & 0x0001ffff;
|
||||
uint32_t new_ptr = RxV + offset;
|
||||
uint32_t start_addr = CS;
|
||||
uint32_t end_addr = start_addr + length;
|
||||
|
||||
if (new_ptr >= end_addr) {
|
||||
new_ptr -= length;
|
||||
} else if (new_ptr < start_addr) {
|
||||
new_ptr += length;
|
||||
}
|
||||
|
||||
return new_ptr;
|
||||
}
|
||||
|
||||
int32_t HELPER(fcircadd)(int32_t RxV, int32_t offset, int32_t M, int32_t CS)
|
||||
{
|
||||
int32_t K_const = (M >> 24) & 0xf;
|
||||
int32_t length = M & 0x1ffff;
|
||||
int32_t mask = (1 << (K_const + 2)) - 1;
|
||||
int32_t K_const = sextract32(M, 24, 4);
|
||||
int32_t length = sextract32(M, 0, 17);
|
||||
uint32_t new_ptr = RxV + offset;
|
||||
uint32_t start_addr = RxV & (~mask);
|
||||
uint32_t end_addr = start_addr | length;
|
||||
uint32_t start_addr;
|
||||
uint32_t end_addr;
|
||||
|
||||
if (K_const == 0 && length >= 4) {
|
||||
return fcircadd_v4(RxV, offset, M, CS);
|
||||
start_addr = CS;
|
||||
end_addr = start_addr + length;
|
||||
} else {
|
||||
/*
|
||||
* Versions v3 and earlier used the K value to specify a power-of-2 size
|
||||
* 2^(K+2) that is greater than the buffer length
|
||||
*/
|
||||
int32_t mask = (1 << (K_const + 2)) - 1;
|
||||
start_addr = RxV & (~mask);
|
||||
end_addr = start_addr | length;
|
||||
}
|
||||
|
||||
if (new_ptr >= end_addr) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue