@@ -1110,33 +1110,41 @@ SW:
11101110
11111111LR.W:
11121112 # R-type: arg1=rs1, arg2=0, arg3=rd
1113- # check alignment
1114- op mod alignment rs1 4
1115- jump misaligned_load notEqual alignment 0
1113+
1114+ # check address and alignment
1115+ op add ret @counter 1
1116+ jump atomic_validate_address always
11161117
11171118 # load value
1118- set address rs1
11191119 op add ret @counter 1
11201120 jump load_word always
11211121
11221122 # register reservation set
11231123 # TODO: implement Za64rs?
1124- set reservation_set rs1
1124+ set reservation_set address
11251125
11261126 jump end_instruction_with_result always
11271127
1128+ atomic_validate_address:
1129+ set address rs1
1130+
1131+ op mod alignment address 4
1132+ jump misaligned_load notEqual alignment 0
1133+
1134+ jump inaccessible_store lessThan address RAM_START
1135+ jump inaccessible_store greaterThanEq address RAM_END
1136+
1137+ set @counter ret
1138+
11281139SC.W:
11291140 # R-type: arg1=rs1, arg2=rs2, arg3=rd
11301141
11311142 # check address and alignment
1132- jump inaccessible_store lessThan rs1 RAM_START
1133- jump inaccessible_store greaterThanEq rs1 RAM_END
1134-
1135- op mod alignment rs1 4
1136- jump misaligned_load notEqual alignment 0
1143+ op add ret @counter 1
1144+ jump atomic_validate_address always
11371145
11381146 # check if reservation is valid and contains rs1
1139- op strictEqual success rs1 reservation_set
1147+ op strictEqual success address reservation_set
11401148
11411149 # invalidate reservation
11421150 set reservation_set null
@@ -1150,7 +1158,6 @@ SC.W__no_write_rd:
11501158 # conditionally write value
11511159 jump end_instruction notEqual success true
11521160
1153- set address rs1
11541161 op add access_ram__ret @counter 1
11551162 jump access_ram always
11561163
@@ -1175,14 +1182,10 @@ AMOSWAP.W:
11751182
11761183amo:
11771184 # check address and alignment
1178- jump inaccessible_store lessThan rs1 RAM_START
1179- jump inaccessible_store greaterThanEq rs1 RAM_END
1180-
1181- op mod alignment rs1 4
1182- jump misaligned_load notEqual alignment 0
1185+ op add ret @counter 1
1186+ jump atomic_validate_address always
11831187
11841188 # read
1185- set address rs1
11861189 op add ret @counter 1
11871190 jump load_word always
11881191
0 commit comments