illegal = False
name = 'svshape'
+ # and fsin and fcos
+ if asmop == 'fsins':
+ illegal = False
+ name = 'fsins'
+ if asmop == 'fcoss':
+ illegal = False
+ name = 'fcoss'
+
# sigh also deal with ffmadds not being supported by binutils (.long)
if asmop == 'ffmadds':
illegal = False
# for when SVREMAP is active, using pre-arranged schedule.
# note: modifying PowerDecoder2 needs to "settle"
remap_en = self.svstate.SVme
- active = self.last_op_svshape and remap_en != 0
+ persist = self.svstate.RMpst
+ active = (persist or self.last_op_svshape) and remap_en != 0
yield self.dec2.remap_active.eq(remap_en if active else 0)
yield Settle()
- if self.is_svp64_mode and self.last_op_svshape:
+ if self.is_svp64_mode and (persist or self.last_op_svshape):
# get four SVSHAPEs. here we are hard-coding
SVSHAPE0 = self.spr['SVSHAPE0']
SVSHAPE1 = self.spr['SVSHAPE1']
# reset at end of loop including exit Vertical Mode
log ("SVSTATE_NEXT: end of loop, reset")
self.svp64_reset_loop()
- self.msr[MSRb.SVF] = 0
+ self.svstate.vfirst = 0
self.update_nia()
if rc_en:
results = [SelectableInt(0, 64)]
# reset at end of loop including exit Vertical Mode
log ("SVSTATE_NEXT: after increments, reset")
self.svp64_reset_loop()
- self.msr[MSRb.SVF] = 0
+ self.svstate.vfirst = 0
elif self.is_svp64_mode:
yield from self.svstate_post_inc()
def svstate_post_inc(self, vf=0):
# check if SV "Vertical First" mode is enabled
- log (" SV Vertical First", vf, self.msr[MSRb.SVF].value)
- if not vf and self.msr[MSRb.SVF].value == 1:
+ vfirst = self.svstate.vfirst
+ log (" SV Vertical First", vf, vfirst)
+ if not vf and vfirst == 1:
self.update_nia()
return True