summaryrefslogtreecommitdiff
path: root/device/lib/stm8-large/malloc.lst
blob: 62ab9c521e558d2e03356676da62db510706b9cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
                                      1 ;--------------------------------------------------------
                                      2 ; File Created by SDCC : free open source ANSI-C Compiler
                                      3 ; Version 3.9.3 #11345 (Linux)
                                      4 ;--------------------------------------------------------
                                      5 	.module malloc
                                      6 	.optsdcc -mstm8
                                      7 	
                                      8 ;--------------------------------------------------------
                                      9 ; Public variables in this module
                                     10 ;--------------------------------------------------------
                                     11 	.globl ___sdcc_heap_init
                                     12 	.globl ___sdcc_heap_free
                                     13 	.globl _malloc
                                     14 ;--------------------------------------------------------
                                     15 ; ram data
                                     16 ;--------------------------------------------------------
                                     17 	.area DATA
      000000                         18 ___sdcc_heap_free::
      000000                         19 	.ds 2
                                     20 ;--------------------------------------------------------
                                     21 ; ram data
                                     22 ;--------------------------------------------------------
                                     23 	.area INITIALIZED
                                     24 ;--------------------------------------------------------
                                     25 ; absolute external ram data
                                     26 ;--------------------------------------------------------
                                     27 	.area DABS (ABS)
                                     28 
                                     29 ; default segment ordering for linker
                                     30 	.area HOME
                                     31 	.area GSINIT
                                     32 	.area GSFINAL
                                     33 	.area CONST
                                     34 	.area INITIALIZER
                                     35 	.area CODE
                                     36 
                                     37 ;--------------------------------------------------------
                                     38 ; global & static initialisations
                                     39 ;--------------------------------------------------------
                                     40 	.area HOME
                                     41 	.area GSINIT
                                     42 	.area GSFINAL
                                     43 	.area GSINIT
                                     44 ;--------------------------------------------------------
                                     45 ; Home
                                     46 ;--------------------------------------------------------
                                     47 	.area HOME
                                     48 	.area HOME
                                     49 ;--------------------------------------------------------
                                     50 ; code
                                     51 ;--------------------------------------------------------
                                     52 	.area CODE
                                     53 ;	../malloc.c: 65: void __sdcc_heap_init(void)
                                     54 ;	-----------------------------------------
                                     55 ;	 function __sdcc_heap_init
                                     56 ;	-----------------------------------------
      000000                         57 ___sdcc_heap_init:
                                     58 ;	../malloc.c: 67: __sdcc_heap_free = HEAP_START;
      000000 AEr00r00         [ 2]   59 	ldw	x, #(___sdcc_heap + 0)
      000003 CFu00u00         [ 2]   60 	ldw	___sdcc_heap_free+0, x
                                     61 ;	../malloc.c: 68: __sdcc_heap_free->next = HEAP_END;
      000006 AEr00r00         [ 2]   62 	ldw	x, #___sdcc_heap_end+0
      000009 72 CFu00u00      [ 5]   63 	ldw	[___sdcc_heap_free+0], x
                                     64 ;	../malloc.c: 69: __sdcc_heap_free->next_free = 0;
      00000D CEu00u00         [ 2]   65 	ldw	x, ___sdcc_heap_free+0
      000010 5C               [ 1]   66 	incw	x
      000011 5C               [ 1]   67 	incw	x
      000012 6F 01            [ 1]   68 	clr	(0x1, x)
      000014 7F               [ 1]   69 	clr	(x)
                                     70 ;	../malloc.c: 70: }
      000015 87               [ 5]   71 	retf
                                     72 ;	../malloc.c: 75: void *malloc(size_t size)
                                     73 ;	-----------------------------------------
                                     74 ;	 function malloc
                                     75 ;	-----------------------------------------
      000016                         76 _malloc:
      000016 52 0C            [ 2]   77 	sub	sp, #12
                                     78 ;	../malloc.c: 86: if(!size || size + offsetof(struct header, next_free) < size)
      000018 1E 10            [ 2]   79 	ldw	x, (0x10, sp)
      00001A 27 06            [ 1]   80 	jreq	00101$
      00001C 5C               [ 1]   81 	incw	x
      00001D 5C               [ 1]   82 	incw	x
      00001E 13 10            [ 2]   83 	cpw	x, (0x10, sp)
      000020 24 03            [ 1]   84 	jrnc	00102$
      000022                         85 00101$:
                                     86 ;	../malloc.c: 87: return(0);
      000022 5F               [ 1]   87 	clrw	x
      000023 20 74            [ 2]   88 	jra	00115$
      000025                         89 00102$:
                                     90 ;	../malloc.c: 88: size += offsetof(struct header, next_free);
                                     91 ;	../malloc.c: 89: if(size < sizeof(struct header)) // Requiring a minimum size makes it easier to implement free(), and avoid memory leaks.
      000025 1F 10            [ 2]   92 	ldw	(0x10, sp), x
      000027 A3 00 04         [ 2]   93 	cpw	x, #0x0004
      00002A 24 05            [ 1]   94 	jrnc	00105$
                                     95 ;	../malloc.c: 90: size = sizeof(struct header);
      00002C AE 00 04         [ 2]   96 	ldw	x, #0x0004
      00002F 1F 10            [ 2]   97 	ldw	(0x10, sp), x
      000031                         98 00105$:
                                     99 ;	../malloc.c: 92: for(h = __sdcc_heap_free, f = &__sdcc_heap_free; h; f = &(h->next_free), h = h->next_free)
      000031 CEu00u00         [ 2]  100 	ldw	x, ___sdcc_heap_free+0
      000034 1F 01            [ 2]  101 	ldw	(0x01, sp), x
      000036 AEr00r00         [ 2]  102 	ldw	x, #(___sdcc_heap_free + 0)
      000039 1F 03            [ 2]  103 	ldw	(0x03, sp), x
      00003B                        104 00113$:
                                    105 ;	../malloc.c: 94: size_t blocksize = (char HEAPSPACE *)(h->next) - (char HEAPSPACE *)h;
      00003B 1E 01            [ 2]  106 	ldw	x, (0x01, sp)
      00003D 27 59            [ 1]  107 	jreq	00111$
      00003F FE               [ 2]  108 	ldw	x, (x)
      000040 1F 05            [ 2]  109 	ldw	(0x05, sp), x
      000042 90 93            [ 1]  110 	ldw	y, x
      000044 1E 01            [ 2]  111 	ldw	x, (0x01, sp)
      000046 1F 07            [ 2]  112 	ldw	(0x07, sp), x
      000048 72 F2 07         [ 2]  113 	subw	y, (0x07, sp)
                                    114 ;	../malloc.c: 101: newheader->next_free = h->next_free;
      00004B 1E 01            [ 2]  115 	ldw	x, (0x01, sp)
      00004D 5C               [ 1]  116 	incw	x
      00004E 5C               [ 1]  117 	incw	x
      00004F 1F 09            [ 2]  118 	ldw	(0x09, sp), x
                                    119 ;	../malloc.c: 95: if(blocksize >= size) // Found free block of sufficient size.
      000051 51               [ 1]  120 	exgw	x, y
      000052 13 10            [ 2]  121 	cpw	x, (0x10, sp)
      000054 51               [ 1]  122 	exgw	x, y
      000055 25 36            [ 1]  123 	jrc	00114$
                                    124 ;	../malloc.c: 97: if(blocksize >= size + sizeof(struct header)) // It is worth creating a new free block
      000057 1E 10            [ 2]  125 	ldw	x, (0x10, sp)
      000059 1C 00 04         [ 2]  126 	addw	x, #0x0004
      00005C 1F 0B            [ 2]  127 	ldw	(0x0b, sp), x
      00005E 93               [ 1]  128 	ldw	x, y
      00005F 13 0B            [ 2]  129 	cpw	x, (0x0b, sp)
      000061 25 1F            [ 1]  130 	jrc	00107$
                                    131 ;	../malloc.c: 99: header_t *const newheader = (header_t *const)((char HEAPSPACE *)h + size);
      000063 1E 07            [ 2]  132 	ldw	x, (0x07, sp)
      000065 72 FB 10         [ 2]  133 	addw	x, (0x10, sp)
                                    134 ;	../malloc.c: 100: newheader->next = h->next;
      000068 1F 0B            [ 2]  135 	ldw	(0x0b, sp), x
      00006A 16 05            [ 2]  136 	ldw	y, (0x05, sp)
      00006C FF               [ 2]  137 	ldw	(x), y
                                    138 ;	../malloc.c: 101: newheader->next_free = h->next_free;
      00006D 1E 0B            [ 2]  139 	ldw	x, (0x0b, sp)
      00006F 5C               [ 1]  140 	incw	x
      000070 5C               [ 1]  141 	incw	x
      000071 16 09            [ 2]  142 	ldw	y, (0x09, sp)
      000073 90 FE            [ 2]  143 	ldw	y, (y)
      000075 FF               [ 2]  144 	ldw	(x), y
                                    145 ;	../malloc.c: 102: *f = newheader;
      000076 1E 03            [ 2]  146 	ldw	x, (0x03, sp)
      000078 16 0B            [ 2]  147 	ldw	y, (0x0b, sp)
      00007A FF               [ 2]  148 	ldw	(x), y
                                    149 ;	../malloc.c: 103: h->next = newheader;
      00007B 1E 01            [ 2]  150 	ldw	x, (0x01, sp)
      00007D 16 0B            [ 2]  151 	ldw	y, (0x0b, sp)
      00007F FF               [ 2]  152 	ldw	(x), y
      000080 20 07            [ 2]  153 	jra	00108$
      000082                        154 00107$:
                                    155 ;	../malloc.c: 106: *f = h->next_free;
      000082 1E 09            [ 2]  156 	ldw	x, (0x09, sp)
      000084 FE               [ 2]  157 	ldw	x, (x)
      000085 16 03            [ 2]  158 	ldw	y, (0x03, sp)
      000087 90 FF            [ 2]  159 	ldw	(y), x
      000089                        160 00108$:
                                    161 ;	../malloc.c: 108: return(&(h->next_free));
      000089 1E 09            [ 2]  162 	ldw	x, (0x09, sp)
      00008B 20 0C            [ 2]  163 	jra	00115$
      00008D                        164 00114$:
                                    165 ;	../malloc.c: 92: for(h = __sdcc_heap_free, f = &__sdcc_heap_free; h; f = &(h->next_free), h = h->next_free)
      00008D 16 09            [ 2]  166 	ldw	y, (0x09, sp)
      00008F 17 03            [ 2]  167 	ldw	(0x03, sp), y
      000091 1E 09            [ 2]  168 	ldw	x, (0x09, sp)
      000093 FE               [ 2]  169 	ldw	x, (x)
      000094 1F 01            [ 2]  170 	ldw	(0x01, sp), x
      000096 20 A3            [ 2]  171 	jra	00113$
      000098                        172 00111$:
                                    173 ;	../malloc.c: 112: return(0);
      000098 5F               [ 1]  174 	clrw	x
      000099                        175 00115$:
                                    176 ;	../malloc.c: 113: }
      000099 5B 0C            [ 2]  177 	addw	sp, #12
      00009B 87               [ 5]  178 	retf
                                    179 	.area CODE
                                    180 	.area CONST
                                    181 	.area INITIALIZER
                                    182 	.area CABS (ABS)