ljmp %5
%2:
} by {
- ; Peephole 112 removed ljmp by inverse jump logic
+ ; Peephole 112.a removed ljmp by inverse jump logic
jb %1,%5
%2:
} if labelInRange
-
-replace {
- ljmp %5
-} by {
- ; Peephole 244 replaced ljmp to ret with ret
- ret
-} if labelIsReturnOnly
-
-
replace {
ljmp %5
%1:
} by {
- ; Peephole 132 changed ljmp to sjmp
+ ; Peephole 112.b changed ljmp to sjmp
sjmp %5
%1:
} if labelInRange
sjmp %7
%3:
clr a
-%7:
+%7:
} by {
; Peephole 241.d optimized compare
clr a
} by {
; Peephole 249b jump optimization
} if labelRefCount %1 1
+
+
+// This allows non-interrupt and interrupt code to safely compete
+// for a resource without the non-interrupt code having to disable
+// interrupts:
+// volatile bit resource_is_free;
+// if( resource_is_free ) {
+// resource_is_free=0; do_something; resource_is_free=1;
+// }
+replace {
+ jnb %1,%2
+%3:
+ clr %1
+} by {
+ ; Peephole 250.a using atomic test and clear
+ jbc %1,%3
+ sjmp %2
+%3:
+} if labelRefCount %3 0
+
+replace {
+ jb %1,%2
+ ljmp %3
+%2:
+ clr %1
+} by {
+ ; Peephole 250.b using atomic test and clear
+ jbc %1,%2
+ ljmp %3
+%2:
+} if labelRefCount %2 1
+
+
+// not before peephole 250.b
+replace {
+ ljmp %5
+} by {
+ ; Peephole 251 replaced ljmp to ret with ret
+ ret
+} if labelIsReturnOnly
+