blob: 8ca5a7cba98f1fd75314b344b2a098a4591591ed [file] [edit]
-- SPDX-License-Identifier: MIT
-- `r` is predefined in the environment and is the equivalent of rnn.init(<gpu>)
function CP_REG_RMW(pkt, size)
local dst_reg = pkt[0].DST_REG
local dst_scratch = pkt[0].DST_SCRATCH
local rotate = pkt[0].ROTATE
local src1_add = pkt[0].SRC1_ADD
local src1_is_reg = pkt[0].SRC1_IS_REG
local src0_is_reg = pkt[0].SRC0_IS_REG
local src0 = pkt[1].SRC0
local src1 = pkt[2].SRC1
local dst = regs.val(dst_reg)
local dst_reg_str = string.format("%s", rnn.regname(r, dst_reg))
if dst_scratch then
dst_reg_str = string.format("CP_SCRATCH[%s]", dst_reg)
end
local src0_str = string.format("0x%08x", src0)
if src0_is_reg then
src0_str = string.format("%s", rnn.regname(r, src0))
src0 = regs.val(src0)
end
local src1_str = string.format("0x%08x", src1)
if src1_is_reg then
src1_str = string.format("%s", rnn.regname(r, src1))
src1 = regs.val(src1)
end
local result = dst & src0
result = (result << rotate) | result >> (32 - rotate)
local op_str
if src1_add then
op_str = '+'
result = result + src1
else
op_str = '|'
result = result | src1
end
result = (dst &~ 0xFFFFFFFF) | result & 0xFFFFFFFF
if dst_scratch then
io.stderr:write("WARNING: Write to CP_SCRATCH is not emulated.")
else
priv.reg_set(dst_reg, result)
end
return string.format("%s = ((%s & %s) rot_l %d) %s %s\n",
dst_reg_str, dst_reg_str, src0_str, rotate,
op_str, src1_str)
end
function CP_MEM_WRITE(pkt, size)
local addr = pkt.ADDR
for i = 2, size - 1 do
dbg("write: %x %x\n", addr, pkt[i])
bos.write(addr, pkt[i])
addr = addr + 4
end
end