@@ -578,6 +578,9 @@ void miss_align_store_commit_queue_push(uint64_t addr, uint64_t data, int len) {
578578 }
579579}
580580
581+ #define GEN_BYTE_MASK (len ) ((1ULL << (len)) - 1)
582+ #define GEN_BIT_MASK (len ) ((len) >= 8 ? (~0ULL) : ((1ULL << ((len) * 8)) - 1))
583+
581584void store_commit_queue_push (uint64_t addr , uint64_t data , int len , int cross_page_store ) {
582585#ifndef CONFIG_DIFFTEST_STORE_COMMIT_AMO
583586 if (cpu .amo ) {
@@ -587,14 +590,51 @@ void store_commit_queue_push(uint64_t addr, uint64_t data, int len, int cross_pa
587590#ifdef CONFIG_AC_NONE
588591 uint8_t store_miss_align = (addr & (len - 1 )) != 0 ;
589592 if (unlikely (store_miss_align )) {
590- if (!cross_page_store ) {
593+ if (!cross_page_store && ! cpu . isVecUnitStore ) {
591594 miss_align_store_commit_queue_push (addr , data , len );
592595 return ;
593596 }
594597 }
595598#endif // CONFIG_AC_NONE
596599 Logm ("push store addr = " FMT_PADDR ", data = " FMT_WORD ", len = %d" , addr , data , len );
597600 store_commit_t store_commit ;
601+
602+ if (cpu .isVecUnitStore )
603+ {
604+ bool isCross128Bit = (addr & 0xF ) + len > 16 ;
605+
606+ if (isCross128Bit )
607+ {
608+ paddr_t offset_in_block = addr & 0xF ;
609+ paddr_t space_left = 16 - offset_in_block ;
610+
611+ paddr_t low_addr = addr ;
612+ uint8_t low_len = space_left ;
613+ uint16_t low_mask = (1U << low_len ) - 1 ;
614+ word_t low_data = data & ((1ULL << low_len * 8 ) - 1 );
615+
616+ paddr_t high_addr = addr + space_left ;
617+ uint8_t high_len = len - space_left ;
618+ uint16_t high_mask = (1U << high_len ) - 1 ;
619+ word_t high_data = data >> (low_len * 8 );
620+
621+ store_commit_t low_store_commit = {low_addr , low_data , low_mask , prev_s -> pc };
622+ store_commit_t high_store_commit = {high_addr , high_data , high_mask , prev_s -> pc };
623+
624+ store_queue_push (low_store_commit );
625+ store_queue_push (high_store_commit );
626+
627+ return ;
628+ }
629+ store_commit .data = data & GEN_BIT_MASK (len );
630+ store_commit .mask = GEN_BYTE_MASK (len );
631+ assert (len <= 8 );
632+ store_commit .addr = addr ;
633+ store_commit .pc = prev_s -> pc ;
634+
635+ store_queue_push (store_commit );
636+ return ;
637+ }
598638 uint64_t offset = addr % 8ULL ;
599639 store_commit .addr = addr - offset ;
600640 switch (len ) {
0 commit comments