comparison backend_x86.c @ 2134:9caebcfeac72

Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
author Michael Pavone <pavone@retrodev.com>
date Fri, 18 Mar 2022 20:49:07 -0700
parents 8554751f17b5
children b6338e18787e
comparison
equal deleted inserted replaced
2133:8554751f17b5 2134:9caebcfeac72
162 max_address = memmap[chunk].start; 162 max_address = memmap[chunk].start;
163 } 163 }
164 164
165 if (memmap[chunk].mask != opts->address_mask) { 165 if (memmap[chunk].mask != opts->address_mask) {
166 and_ir(code, memmap[chunk].mask, adr_reg, opts->address_size); 166 and_ir(code, memmap[chunk].mask, adr_reg, opts->address_size);
167 }
168 code_ptr after_normal = NULL;
169 if (size == SZ_B && memmap[chunk].shift != 0) {
170 btr_ir(code, 0, adr_reg, opts->address_size);
171 code_ptr normal = code->cur+1;
172 jcc(code, CC_NC, normal);
173 if (memmap[chunk].shift > 0) {
174 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size);
175 } else {
176 shr_ir(code, -memmap[chunk].shift, adr_reg, opts->address_size);
177 }
178 or_ir(code, 1, adr_reg, opts->address_size);
179 after_normal = code->cur + 1;
180 jmp(code, after_normal);
181 *normal = code->cur - (normal + 1);
182 }
183 if (memmap[chunk].shift > 0) {
184 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size);
185 } else if (memmap[chunk].shift < 0) {
186 shr_ir(code, -memmap[chunk].shift, adr_reg, opts->address_size);
187 }
188 if (after_normal) {
189 *after_normal = code->cur - (after_normal + 1);
167 } 190 }
168 void * cfun; 191 void * cfun;
169 switch (fun_type) 192 switch (fun_type)
170 { 193 {
171 case READ_16: 194 case READ_16: