CR0 (if Rc=1)
+# Add With Shift By Immediate Word
+
+Z23-Form
+
+* shaddw RT,RA,RB,sm (Rc=0)
+* shaddw. RT,RA,RB,sm (Rc=1)
+
+Pseudo-code:
+
+ n <- ([0]*(XLEN/2)) || (RB)[XLEN/2:XLEN-1]
+ if (RB)[XLEN/2] = 1 then
+ n[0:XLEN/2-1] <- [1]*(XLEN/2)
+ m <- ((0b0 || sm) + 1)
+ RT <- (n[m:XLEN-1] || [0]*m) + (RA)
+
+Special Registers Altered:
+
+ CR0 (if Rc=1)
+
# Add With Shift By Immediate Unsigned Word
Z23-Form
30/6=fmrgew,NORMAL,,1P,EXTRA3,NO,d:FRT,s:FRA,s:FRB,0,FRA,FRB,0,FRT,0,0,0
rlwnm,NORMAL,,1P,EXTRA3,NO,d:RA;d:CR0,s:RB,s:RS,0,0,RB,RS,RA,0,CR0,0
shadd,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
+shaddw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
shadduw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
minu,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
maxu,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
0001001110-,ALU,OP_MINMAX,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,minu,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1101001110-,ALU,OP_AVGADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,avgadd,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
--01101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shadd,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
+--10101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shaddw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
--11101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shadduw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1011110110-,ALU,OP_ABSDIFF,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,absdu,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1001110110-,ALU,OP_ABSDIFF,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,absds,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
'absdu', 'absds', 'absdacs', 'absdacu', 'avgadd',
'fmvis', 'fishmv', 'pcdec', "maddedu", "divmod2du",
"dsld", "dsrd", "maddedus",
- "shadd", "shadduw",
+ "shadd", "shaddw", "shadduw",
]:
illegal = False
ins_name = dotstrp
"svshape2", # https://libre-soc.org/openpower/sv/remap/discussion TODO
"svstep", # https://libre-soc.org/openpower/sv/setvl
"sim_cfg",
- "shadd", "shadduw",
+ "shadd", "shaddw", "shadduw",
"slbia", "sld", "slw", "srad", "sradi",
"sraw", "srawi", "srd", "srw",
"stb", "stbcix", "stbcx", "stbu", "stbux", "stbx",
]
self._do_tst(expected)
- def test_31_shadd_shadduw(self):
+ def test_31_shadd_shaddw_shadduw(self):
expected = [
"shadd 31,0,0,0",
"shadd 0,31,0,0",
"shadd. 0,31,0,0",
"shadd. 0,0,31,0",
"shadd. 0,0,0,3",
+ "shaddw 31,0,0,0",
+ "shaddw 0,31,0,0",
+ "shaddw 0,0,31,0",
+ "shaddw 0,0,0,3",
+ "shaddw. 31,0,0,0",
+ "shaddw. 0,31,0,0",
+ "shaddw. 0,0,31,0",
+ "shaddw. 0,0,0,3",
"shadduw 31,0,0,0",
"shadduw 0,31,0,0",
"shadduw 0,0,31,0",
e.intregs[3] = RT
self.add_case(prog, gprs, expected=e)
+ def case_shaddw(self):
+ for sm in range(4):
+ with self.subTest(sm=sm):
+ insn = ("shaddw 3,4,5,%d" % sm)
+ prog = Program(list(SVP64Asm([insn])), False)
+ gprs = [0] * 32
+ gprs[3] = 0x01234567890abcde
+ RA = gprs[4] = 0xf00dcafedeadbeef
+ RB = gprs[5] = 0xabadbabedefec8ed
+ RB_i32 = RB & _MASK32
+ if RB_i32 >> 31:
+ RB_i32 -= 1 << 32
+ RT = ((((RB_i32 << (sm+1)) & _MASK64) + RA) & _MASK64)
+ e = ExpectedState(pc=4, int_regs=gprs)
+ e.intregs[3] = RT
+ self.add_case(prog, gprs, expected=e)
+
def case_shadduw(self):
for sm in range(4):
with self.subTest(sm=sm):