+ extra_bits = 0
+ v30b_newfields = []
+ for extra_idx, (idx, field, regname, regtype) in extras.items():
+ # is it a field we don't alter/examine? if so just put it
+ # into newfields
+ if regtype is None:
+ v30b_newfields.append(field)
+
+ # first, decode the field number. "5.v" or "3.s" or "9"
+ field = field.split(".")
+ regmode = 'scalar' # default
+ if len(field) == 2:
+ if field[1] == 's':
+ regmode = 'scalar'
+ elif field[1] == 'v':
+ regmode = 'vector'
+ field = int(field[0]) # actual register number
+ print (" ", regmode, field)
+ if regtype == 'GPR':
+ if regmode == 'scalar':
+ # cut into 2-bits 5-bits SS FFFFF
+ sv_extra = field >> 5
+ field = field & 0b11111
+ else:
+ # cut into 5-bits 2-bits FFFFF SS
+ sv_extra = field & 0b11
+ field = field >> 2
+ # now sanity-check. EXTRA3 is ok, EXTRA2 has limits
+ if etype == 'EXTRA2':
+ if regmode == 'scalar':
+ assert sv_extra & 0b10 == 0, \
+ "scalar field %s cannot fit into EXTRA2 %s" % \
+ (regname, str(extras[extra_idx]))
+ else:
+ assert sv_extra & 0b01 == 0, \
+ "vector field %s cannot fit into EXTRA2 %s" % \
+ (regname, str(extras[extra_idx]))
+
+ # append altered field value to v3.0b
+ v30b_newfields.append(str(field))
+
+ print ("new v3.0B fields", v30b_op, v30b_newfields)
+ print ()