# mode bits
MOD2_MSB = 0
MOD2_LSB = 1
+ MOD3 = 3
# pack detection (TODO, CR-ops needs one of these too)
LDST_PACK = 2 # set =1 for LD/ST-immediate Pack mode
ARITH_PACK = 4 # set =1 for Arithmetic Pack mode
BC_CTRTEST = 0 # CTR-test mode
# reduce mode
REDUCE = 2 # 0=normal predication 1=reduce mode
- PTREDUCE = 3 # 1=parallel reduce, 0=scalar reduce
SVM = 3 # subvector reduce mode 0=independent 1=horizontal
CRM = 4 # CR mode on reduce (Rc=1) 0=some 1=all
RG = 4 # Reverse-gear on reduce
SATURATE = 3
PREDRES = 4
BRANCH = 5
- PTREDUCE = 6 # Parallel Reduction
@unique
| --- | --- |---------|-------------------------- |
| 00 | 0 | dz sz | simple mode |
| 00 | 1 | 0 RG | scalar reduce mode (mapreduce), SUBVL=1 |
-| 00 | 1 | 1 / | parallel reduce mode (mapreduce), SUBVL=1 |
| 00 | 1 | SVM 0 | subvector reduce mode, SUBVL>1 |
| 00 | 1 | SVM 1 | Pack/Unpack mode, SUBVL>1 |
| 01 | inv | CR-bit | Rc=1: ffirst CR sel |
comb += self.mode.eq(SVP64RMMode.NORMAL)
comb += do_pu.eq(mode[SVP64MODE.LDST_PACK]) # Pack mode
with m.Elif(mode[SVP64MODE.REDUCE]):
- with m.If(mode[SVP64MODE.PTREDUCE]):
- comb += self.mode.eq(SVP64RMMode.PTREDUCE)
- with m.Else():
- comb += self.mode.eq(SVP64RMMode.MAPREDUCE)
- # Pack only active if SVM=1 & SUBVL>1 & Mode[4]=1
- with m.If(self.rm_in.subvl != Const(0, 2)): # active
- comb += do_pu.eq(mode[SVP64MODE.ARITH_PACK])
+ comb += self.mode.eq(SVP64RMMode.MAPREDUCE)
+ # Pack only active if SVM=1 & SUBVL>1 & Mode[4]=1
+ with m.If(self.rm_in.subvl != Const(0, 2)): # active
+ comb += do_pu.eq(mode[SVP64MODE.ARITH_PACK])
with m.Else():
comb += self.mode.eq(SVP64RMMode.NORMAL)
with m.Case(1):
with m.If((~is_ldst) & # not for LD/ST
(mode2 == 0) & # first 2 bits == 0
mode[SVP64MODE.REDUCE] & # bit 2 == 1
- (~mode[SVP64MODE.PTREDUCE])): # not parallel mapreduce
+ (~mode[SVP64MODE.MOD3])): # bit 3 == 0
comb += self.reverse_gear.eq(mode[SVP64MODE.RG]) # finally whew
# extract zeroing
dst_zero = 0
sv_mode = None
- parallel = False
mapreduce = False
reverse_gear = False
mapreduce_crm = False
assert sv_mode is None
sv_mode = 0b00
mapreduce = True
- # parallel prefix mode
- elif encmode == 'pp':
- assert sv_mode is None
- sv_mode = 0b00
- parallel = True
elif encmode == 'crm': # CR on map-reduce
assert sv_mode is None
sv_mode = 0b00
| --- | --- |---------|-------------------------- |
| 00 | 0 | dz sz | simple mode |
| 00 | 1 | 0 RG | scalar reduce mode (mapreduce), SUBVL=1 |
- | 00 | 1 | 1 / | parallel reduce mode (mapreduce), SUBVL=1 |
| 00 | 1 | SVM 0 | subvector reduce mode, SUBVL>1 |
| 00 | 1 | SVM 1 | Pack/Unpack mode, SUBVL>1 |
| 01 | inv | CR-bit | Rc=1: ffirst CR sel |
######################################
# "mapreduce" modes
elif sv_mode == 0b00:
- if parallel:
- mode |= (0b1 << SVP64MODE.PTREDUCE) # sets parallel reduce
- assert subvl == 0, "TODO sub-vector parallel reduce"
- else:
- mode |= (0b1 << SVP64MODE.REDUCE) # sets mapreduce
+ mode |= (0b1 << SVP64MODE.REDUCE) # sets mapreduce
assert dst_zero == 0, "dest-zero not allowed in mapreduce mode"
if reverse_gear:
mode |= (0b1 << SVP64MODE.RG) # sets Reverse-gear mode
'sv.ffmadds 6.v, 2.v, 4.v, 6.v', # correctly converted to .long
'svshape2 8, 1, 31, 7, 1, 1',
]
- lst = [
- 'sv.add./pp 5.v, 2.v, 1.v',
- ]
isa = SVP64Asm(lst, macros=macros)
log("list:\n", "\n\t".join(list(isa)))
# running svp64.py is designed to test hard-coded lists