Skip to content

Commit b38af69

Browse files
committed
Refactor atomics to reduce duplication
1 parent 5c8fe65 commit b38af69

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/main.mlog

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,33 +1110,41 @@ SW:
11101110

11111111
LR.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+
11281139
SC.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

11761183
amo:
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

Comments
 (0)