Add a rotate/mask/shift unit and use it in execute1
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 7 Oct 2019 07:26:11 +0000 (18:26 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 7 Oct 2019 07:33:14 +0000 (18:33 +1100)
commitf7c393ba7e73787a77c444bba6c9eed329ff3b32
treec96f6210059ccc4179492df287230fb5df3d7554
parent90b6e273809e81c1c32a537b94cef0f530e63337
Add a rotate/mask/shift unit and use it in execute1

This adds a new entity 'rotator' which contains combinatorial logic
for rotating and masking 64-bit values.  It implements the operations
of the rlwinm, rlwnm, rlwimi, rldicl, rldicr, rldic, rldimi, rldcl,
rldcr, sld, slw, srd, srw, srad, sradi, sraw and srawi instructions.
It consists of a 3-stage 64-bit rotator using 4:1 multiplexors at
each stage, two mask generators, output logic and control logic.

The insn_type_t values used for these instructions have been reduced
to just 5: OP_RLC, OP_RLCL and OP_RLCR for the rotate and mask
instructions (clear both left and right, clear left, clear right
variants), OP_SHL for left shifts, and OP_SHR for right shifts.
The control signals for the rotator are derived from the opcode
and from the is_32bit and is_signed fields of the decode_rom_t.

The rotator is instantiated as an entity in execute1 so that we can
be sure we only have one of it.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Makefile
decode1.vhdl
decode2.vhdl
decode_types.vhdl
execute1.vhdl
microwatt.core
rotator.vhdl [new file with mode: 0644]
rotator_tb.vhdl [new file with mode: 0644]