@@ -14,8 +14,8 @@ contract RISCV is IBigStepper {
1414 IPreimageOracle public oracle;
1515
1616 /// @notice The version of the contract.
17- /// @custom:semver 1.1.0-rc.1
18- string public constant version = "1.1.0-rc.1 " ;
17+ /// @custom:semver 1.1.0-rc.2
18+ string public constant version = "1.1.0-rc.2 " ;
1919
2020 /// @param _oracle The preimage oracle contract.
2121 constructor (IPreimageOracle _oracle ) {
@@ -644,16 +644,18 @@ contract RISCV is IBigStepper {
644644 rightShamt := sub64 (sub64 (toU64 (64 ), alignment), size)
645645 }
646646
647+ let addr_ := addr
648+ let size_ := size
647649 // left: prepare for byte-taking by right-aligning
648650 left := shr (u64ToU256 (shl64 (toU64 (3 ), leftShamt)), left)
649651 // right: right-align for byte-taking by right-aligning
650652 right := shr (u64ToU256 (shl64 (toU64 (3 ), rightShamt)), right)
651653 // loop:
652- for { let i := 0 } lt (i, size ) { i := add (i, 1 ) } {
654+ for { let i := 0 } lt (i, size_ ) { i := add (i, 1 ) } {
653655 // translate to reverse byte lookup, since we are reading little-endian memory, and need the highest
654656 // byte first.
655657 // effAddr := (addr + size - 1 - i) &^ 31
656- let effAddr := and64 (sub64 (sub64 (add64 (addr, size ), toU64 (1 )), toU64 (i)), not64 (toU64 (31 )))
658+ let effAddr := and64 (sub64 (sub64 (add64 (addr_, size_ ), toU64 (1 )), toU64 (i)), not64 (toU64 (31 )))
657659 // take a byte from either left or right, depending on the effective address
658660 let b := toU256 (0 )
659661 switch eq64 (effAddr, leftAddr)
@@ -670,7 +672,7 @@ contract RISCV is IBigStepper {
670672 }
671673
672674 if signed {
673- let signBitShift := sub64 (shl64 (toU64 (3 ), size ), toU64 (1 ))
675+ let signBitShift := sub64 (shl64 (toU64 (3 ), size_ ), toU64 (1 ))
674676 out := signExtend64 (out, signBitShift)
675677 }
676678 }
@@ -822,21 +824,24 @@ contract RISCV is IBigStepper {
822824 count := pdatlen
823825 }
824826
825- let bits := shl64 (toU64 (3 ), sub64 (toU64 (32 ), count)) // 32-count, in bits
827+ let addr_ := addr
828+ let count_ := count
829+ let bits := shl64 (toU64 (3 ), sub64 (toU64 (32 ), count_)) // 32-count, in bits
826830 let mask := not (sub (shl (u64ToU256 (bits), toU256 (1 )), toU256 (1 ))) // left-aligned mask for count bytes
827831 let alignmentBits := u64ToU256 (shl64 (toU64 (3 ), alignment))
828832 mask := shr (alignmentBits, mask) // mask of count bytes, shifted by alignment
829833 let pdat := shr (alignmentBits, b32asBEWord (pdatB32)) // pdat, shifted by alignment
830834
831835 // update pre-image reader with updated offset
832- let newOffset := add64 (offset, count )
836+ let newOffset := add64 (offset, count_ )
833837 setPreimageOffset (newOffset)
834838
835- let node := getMemoryB32 (sub64 (addr, alignment), 1 )
839+ out := count_
840+
841+ let node := getMemoryB32 (sub64 (addr_, alignment), 1 )
836842 let dat := and (b32asBEWord (node), not (mask)) // keep old bytes outside of mask
837843 dat := or (dat, and (pdat, mask)) // fill with bytes from pdat
838- setMemoryB32 (sub64 (addr, alignment), beWordAsB32 (dat), 1 )
839- out := count
844+ setMemoryB32 (sub64 (addr_, alignment), beWordAsB32 (dat), 1 )
840845 }
841846
842847 //
@@ -1139,6 +1144,7 @@ contract RISCV is IBigStepper {
11391144
11401145 switch opcode
11411146 case 0x03 {
1147+ let pc_ := _pc
11421148 // 000_0011: memory loading
11431149 // LB, LH, LW, LD, LBU, LHU, LWU
11441150 let imm := parseImmTypeI (instr)
@@ -1148,9 +1154,10 @@ contract RISCV is IBigStepper {
11481154 let memIndex := add64 (rs1Value, signExtend64 (imm, toU64 (11 )))
11491155 let rdValue := loadMem (memIndex, size, signed, 1 , 2 )
11501156 setRegister (rd, rdValue)
1151- setPC (add64 (_pc , toU64 (4 )))
1157+ setPC (add64 (pc_ , toU64 (4 )))
11521158 }
11531159 case 0x23 {
1160+ let pc_ := _pc
11541161 // 010_0011: memory storing
11551162 // SB, SH, SW, SD
11561163 let imm := parseImmTypeS (instr)
@@ -1159,7 +1166,7 @@ contract RISCV is IBigStepper {
11591166 let rs1Value := getRegister (rs1)
11601167 let memIndex := add64 (rs1Value, signExtend64 (imm, toU64 (11 )))
11611168 storeMem (memIndex, size, value, 1 , 2 )
1162- setPC (add64 (_pc , toU64 (4 )))
1169+ setPC (add64 (pc_ , toU64 (4 )))
11631170 }
11641171 case 0x63 {
11651172 // 110_0011: branching
0 commit comments