10 @ LDM CASE
#1 (used when rx is in upper_list)
12 @ ldm rx
!, {lower_list
}
13 @ ldm rx
, {upper_list
}
17 @ LDM CASE
#1 bis (used when rx is in upper_list and pc is
20 @ ldm rx
!, {lower_list
}
21 @ ldm rx
, {upper_list
}
24 @ LDM CASE
#2 (used when rx is not in upper_list)
26 @ mov ry
, rx where ry is the lowest register from upper_list
27 @ ldm ry
!, {lower_list
}
28 @ ldm ry
, {upper_list
}
32 @ LDM CASE
#2 bis (used when rx is in lower_list)
34 @ mov ry
, rx where ry is the lowest register from upper_list
35 @ ldm ry
!, {lower_list
}
36 @ ldm ry
, {upper_list
}
40 @ LDM CASE
#2 ter (used when rx is not in upper_list and pc is
43 @ mov ry
, rx where ry is the lowest register from upper_list
44 @ ldm ry
!, {lower_list
}
45 @ ldm ry
, {upper_list
}
48 @ LDM CASE
#2 quater (used when rx is in lower_list and pc is
51 @ mov ry
, rx where ry is the lowest register from upper_list
52 @ ldm ry
!, {lower_list
}
53 @ ldm ry
, {upper_list
}
56 @ LDM CASE
#3 (used when rx is not in upper_list)
58 @ ldm rx
!, {lower_list
}
59 @ ldm rx
!, {upper_list
}
61 @ Write-back variant are unpredictable when rx appears also in
62 @ the loaded registers
65 @ LDM CASE
#3 bis (used when rx is not in upper_list and pc is
68 @ ldm rx
!, {lower_list
}
69 @ ldm rx
!, {upper_list
}
70 ldm.w
r0!, {r1-
r9, pc
}
72 @ LDM CASE
#4 (used when pc is not in reglist and rx is in
75 @ ldmb rx
!, {upper_list
}
76 @ ldmb rx
, {lower_list
}
79 @ LDM CASE
#5 (used when pc is not in reglist and rx is not in
81 @ It looks like it this mean that it could
be in upper_list
or not
83 @ mov ry
, rx where ry is the lowest register from lower_list
84 @ ldmdb ry
!, {upper_list
}
85 @ ldmdb ry
, {lower_list
}
89 @ LDM CASE
#5 bis (used when pc is not in reglist and rx is in
92 @ mov ry
, rx where ry is the lowest register from lower_list
93 @ ldmdb ry
!, {upper_list
}
94 @ ldmdb ry
, {lower_list
}
98 @ LDM CASE
#6 (used when pc is in reglist and rx is in
101 @
sub rx
, rx
, #size (lower_list + upper_list)
102 @ ldm rx
!, {lower_list
}
103 @ ldm rx
, {upper_list
}
104 @ This case reverses the load order
105 ldmdb.w
r9, {r1-
r9, pc
}
107 @ LDM CASE
#6 bis (used when pc is in reglist and rx is in
110 @
sub rx
, rx
, #size (lower_list + upper_list)
111 @ ldm rx
!, {lower_list
}
112 @ ldm rx
, {upper_list
}
113 ldmdb.w
r1, {r1-
r9, pc
}
115 @ LDM CASE
#7 (used when pc is in reglist and rx is not in
118 @
sub ry
, rx
, #size (lower_list + upper_list) where ry is the lowest
119 @ register of the upper list
120 @ ldm ry
!, {lower_list
}
121 @ ldm ry
, {upper_list
}
122 @ This case reverses the load order
123 ldmdb.w
r0, {r1-
r9, pc
}
125 @ LDM CASE
#8 (used when pc is in not in reglist)
126 @ ldmdb rx
!, {...} ->
127 @ ldm rx
!, {upper_list
}
128 @ ldm rx
!, {lower_list
}
132 @ LDM CASE
#9 (Used when pc is in reglist)
133 @ ldmdb rx
!, {...} ->
134 @
sub rx
, rx
, #size (lower_list + upper_list)
135 @ mov ry
, rx where ry is the lowest register from upper_list
136 @ ldm ry
!, {lower_list
}
137 @ ldm ry
, {upper_list
}
138 ldmdb.w
r0!, {r1-
r9, pc
}
140 @ POP CASE
#1 (list does not include pc)
141 @ pop
{...} -> pop {lower_list} pop {upper_list}
145 @ POP CASE
#2 (list includes PC)
146 @ pop
{...} -> pop {lower_list} pop {upper_list}