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}