@@ -27,6 +27,13 @@ void StoreRecorder::clear_valid(DifftestStoreEvent &probe) {
2727 probe.valid = 0 ;
2828}
2929
30+ // Expand 8-bit mask to bit-and with 64-bit wide data
31+ static uint64_t MaskExpand (uint8_t mask) {
32+ uint64_t expander = 0x01010101'01010101ULL ;
33+ uint64_t selector = 0x80402010'08040201ULL ;
34+ return (((((mask * expander) & selector) * 0xFFULL ) >> 7 ) & expander) * 0xFFULL ;
35+ }
36+
3037int StoreRecorder::check (const DifftestStoreEvent &probe) {
3138 if (!probe.valid )
3239 return STATE_OK;
@@ -35,18 +42,91 @@ int StoreRecorder::check(const DifftestStoreEvent &probe) {
3542 int WORDBYTES = 8 ;
3643 int COMMITBYTES = 16 ;
3744
38- auto addr = probe.addr ;
39- auto lowData = probe.data ;
40- auto highData = probe.highData ;
41- auto mask = probe.mask ;
45+ uint64_t calcAddr;
46+ uint64_t calcDataLow;
47+ uint64_t calcDataHigh;
48+ uint16_t calcMask;
49+ uint8_t calcEEW;
50+ bool calcIsVSLine;
51+
52+ auto isNonCacheable = probe.isNonCacheable ;
53+ auto isVStore = probe.isVStore ;
54+ auto isUStride = probe.isUStride ;
55+ auto isMasked = probe.isMasked ;
56+ auto isWhole = probe.isWhole ;
57+ auto veew = probe.veew ;
58+ auto nf = probe.nf ;
59+ auto rawDataLow = probe.rawDataLow ;
60+ auto rawDataHigh = probe.rawDataHigh ;
61+ auto rawMask = probe.rawMask ;
62+ auto rawAddr = probe.rawAddr ;
63+ auto wline = probe.wline ;
64+ auto vecValid = probe.vecValid ;
65+ auto isHighPart = probe.isHighPart ;
66+
67+ if (!isNonCacheable) {
68+ bool isVse = isVStore && isUStride;
69+ bool isVsm = isVStore && isMasked;
70+ bool isVsr = isVStore && isWhole;
71+
72+ uint8_t eew = veew;
73+ uint32_t EEB = 1 << eew;
74+ uint32_t EEWBits = EEB << 3 ;
75+ uint8_t nf2 = isVsr ? nf : 0 ;
76+
77+ bool isSegment = nf != 0 && !isVsm;
78+ bool isVSLine = (isVse || isVsm || isVsr) && !isSegment;
79+ bool isWline = wline;
80+ calcIsVSLine = isVSLine;
81+
82+ uint8_t flow = isVSLine ? (16 >> eew) : 0 ;
83+
84+ if (isVSLine) {
85+ calcAddr = rawAddr;
86+ calcDataLow = rawDataLow;
87+ calcDataHigh = rawDataHigh;
88+ calcMask = rawMask;
89+ } else if (isWline) {
90+ calcAddr = rawAddr;
91+ calcDataLow = rawDataLow;
92+ calcDataHigh = rawDataHigh;
93+ calcMask = rawMask;
94+ Assert (rawDataLow == 0 && rawDataHigh == 0 , " wline only supports whole zero write now" );
95+ } else if (isHighPart) {
96+ calcAddr = (rawAddr & (~0xFULL )) | 0b1000 ;
97+ calcMask = (rawMask >> 8 ) & 0xFF ;
98+ uint64_t tmpData = rawDataHigh;
99+ calcDataLow = tmpData & MaskExpand (calcMask);
100+ calcDataHigh = 0 ;
101+ } else {
102+ calcAddr = rawAddr & (~0xFULL );
103+ calcMask = rawMask & 0xFF ;
104+ uint64_t tmpData = rawDataLow;
105+ calcDataLow = tmpData & MaskExpand (calcMask);
106+ calcDataHigh = 0 ;
107+ }
108+ calcEEW = EEB;
109+ } else {
110+ calcAddr = rawAddr & (~7ULL );
111+ calcMask = rawMask;
112+ calcDataLow = rawDataLow & MaskExpand (calcMask);
113+ calcDataHigh = 0 ;
114+ calcEEW = 0 ;
115+ calcIsVSLine = false ;
116+ }
117+
118+ auto addr = calcAddr;
119+ auto lowData = calcDataLow;
120+ auto highData = calcDataHigh;
121+ auto mask = calcMask;
42122 auto offset = probe.offset ;
43- auto eew = probe. eew ;
123+ auto eew = calcEEW ;
44124 auto pc = probe.pc ;
45125 auto robIdx = probe.robidx ;
46126
47127 uint64_t rawVecAddr = addr + offset;
48128
49- if (probe. vecNeedSplit ) {
129+ if (calcIsVSLine ) {
50130 uint16_t flow = COMMITBYTES / eew;
51131 uint64_t flowMask = (eew == 1 ) ? 0x1ULL : (eew == 2 ) ? 0x3ULL : (eew == 4 ) ? 0xfULL : (eew == 8 ) ? 0xffULL : 0x0ULL ;
52132 uint64_t flowMaskBit = (eew == 1 ) ? 0xffULL
@@ -103,7 +183,7 @@ int StoreRecorder::check(const DifftestStoreEvent &probe) {
103183
104184 nextOffset = 8 - rawOffset;
105185 auto nextDataOffset = nextOffset * 8 ;
106- auto nextData = probe. highData << nextDataOffset;
186+ auto nextData = calcDataHigh << nextDataOffset;
107187
108188 refStoreCommitData = (nextData + presentData) & flowMaskBit;
109189 } else {
@@ -145,9 +225,9 @@ int StoreRecorder::check(const DifftestStoreEvent &probe) {
145225 }
146226 } else {
147227 DiffState::StoreCommit storeCommit = {probe.valid ,
148- probe. addr ,
228+ calcAddr ,
149229 lowData,
150- static_cast <uint8_t >(probe. mask & 0xFF ),
230+ static_cast <uint8_t >(calcMask & 0xFF ),
151231 pc,
152232 robIdx
153233#ifdef CONFIG_DIFFTEST_SQUASH
0 commit comments