+ # connect MSR.PR etc. for priv/virt operation
+ comb += pi.priv_mode.eq(~oper_r.msr[MSR.PR])
+ comb += pi.virt_mode.eq(oper_r.msr[MSR.DR])
+ comb += pi.mode_32bit.eq(~oper_r.msr[MSR.SF])
+ sync += Display("LDSTCompUnit: oper_r.msr %x pr=%x dr=%x sf=%x",
+ oper_r.msr,
+ oper_r.msr[MSR.PR],
+ oper_r.msr[MSR.DR],
+ oper_r.msr[MSR.SF])
+
+ # byte-reverse on LD
+ revnorev = Signal(64, reset_less=True)
+ with m.If(oper_r.byte_reverse):
+ # byte-reverse the data based on ld/st width (turn it to LE)
+ data_len = oper_r.data_len
+ lddata_r = byte_reverse(m, 'lddata_r', pi.ld.data, data_len)
+ comb += revnorev.eq(lddata_r) # put reversed- data out
+ with m.Else():
+ comb += revnorev.eq(pi.ld.data) # put data out, straight (as BE)
+
+ # then check sign-extend
+ with m.If(oper_r.sign_extend):
+ # okok really should "if data_len == 4" and so on here
+ with m.If(oper_r.data_len == 2):
+ comb += ldd_o.eq(exts(revnorev, 16, 64)) # sign-extend hword
+ with m.Else():
+ comb += ldd_o.eq(exts(revnorev, 32, 64)) # sign-extend dword
+ with m.Else():
+ comb += ldd_o.eq(revnorev)
+