+ # saturation
+ elif encmode == 'sats':
+ assert sv_mode is None
+ saturation = 1
+ sv_mode = 0b10
+ elif encmode == 'satu':
+ assert sv_mode is None
+ sv_mode = 0b10
+ saturation = 0
+ # predicate zeroing
+ elif encmode == 'sz':
+ src_zero = 1
+ elif encmode == 'dz':
+ dst_zero = 1
+ # failfirst
+ elif encmode.startswith("ff="):
+ assert sv_mode is None
+ sv_mode = 0b01
+ failfirst = decode_ffirst(encmode[3:])
+ # predicate-result, interestingly same as fail-first
+ elif encmode.startswith("pr="):
+ assert sv_mode is None
+ sv_mode = 0b11
+ predresult = decode_ffirst(encmode[3:])
+ # map-reduce mode
+ elif encmode == 'mr':
+ assert sv_mode is None
+ sv_mode = 0b00
+ mapreduce = True
+ elif encmode == 'crm': # CR on map-reduce
+ assert sv_mode is None
+ sv_mode = 0b00
+ mapreduce_crm = True
+ elif encmode == 'svm': # sub-vector mode
+ mapreduce_svm = True
+
+ # construct the mode field, doing sanity-checking along the way
+
+ if mapreduce_svm:
+ assert sv_mode == 0b00, "sub-vector mode in mapreduce only"
+ assert subvl != 0, "sub-vector mode not possible on SUBVL=1"
+
+ # "normal" mode
+ if sv_mode is None:
+ mode |= (src_zero << 3) | (dst_zero << 4)
+
+ # "mapreduce" modes
+ elif sv_mode == 0b00:
+ mode |= (0b1<<2) # sets mapreduce
+ assert dst_zero == 0, "dest-zero not allowed in mapreduce mode"
+ if mapreduce_crm:
+ mode |= (0b1<<4) # sets CRM mode
+ assert rc_mode, "CRM only allowed when Rc=1"
+ # bit of weird encoding to jam zero-pred or SVM mode in.
+ # SVM mode can be enabled only when SUBVL=2/3/4 (vec2/3/4)
+ if subvl == 0:
+ mode |= (src_zero << 3) # predicate src-zeroing
+ elif mapreduce_svm:
+ mode |= (1 << 3) # SVM mode
+
+ # "failfirst" modes
+ elif sv_mode == 0b01:
+ assert dst_zero == 0, "dest-zero not allowed in failfirst mode"
+ mode |= 0b01 # sets failfirst
+ if failfirst == 'RC1':
+ mode |= (0b1<<4) # sets RC1 mode
+ mode |= (src_zero << 3) # predicate src-zeroing
+ assert rc_mode==False, "ffirst RC1 only possible when Rc=0"
+ elif failfirst == '~RC1':
+ mode |= (0b1<<4) # sets RC1 mode...
+ mode |= (src_zero << 3) # predicate src-zeroing
+ mode |= (0b1<<2) # ... with inversion
+ assert rc_mode==False, "ffirst RC1 only possible when Rc=0"
+ else:
+ assert src_zero == 0, "src-zero not allowed in ffirst BO"
+ mode |= (failfirst << 2) # set BO