|
221 | 221 | /**
|
222 | 222 | * Binary coded decimal support.
|
223 | 223 | *
|
224 |
| - * <p>This allows linker scripts to generate dd commands. Leading spaces |
225 |
| - * need to be inserted so Mac doesn't consider them octal; therefore, |
226 |
| - * parameters must be quoted; and eight digits should be good enough. |
| 224 | + * <p>This allows linker scripts to generate dd commands, e.g. ape.lds. |
| 225 | + * There are a few ways to pad each number to the necessary 8 bytes. |
| 226 | + * Spaces cannot be prepended because busybox refuses to parse them. |
| 227 | + * Zeros cannot be prepended because Mac will take numbers as octal. |
| 228 | + * That leaves appending spaces. The user's shell ought to treat any |
| 229 | + * unquoted run of spaces as if there was only one, so this is safe. |
227 | 230 | */
|
228 |
| -#define SHSTUB2(SYM, X) \ |
229 |
| - HIDDEN(SYM##_bcs0 = BCD10K(X)); \ |
230 |
| - HIDDEN(SYM##_bcs1 = BCD(X)) |
231 |
| -#define BCD(X) \ |
232 |
| - ((X) == 0 \ |
233 |
| - ? 0x20202030 \ |
234 |
| - : (X) < 10 ? 0x30202020 + (((X) % 10) << 24) \ |
235 |
| - : (X) < 100 ? 0x30302020 + (((X) % 10) << 24) + \ |
236 |
| - (((X) / 10 % 10) << 16) \ |
237 |
| - : (X) < 1000 ? 0x30303020 + (((X) % 10) << 24) + \ |
238 |
| - (((X) / 10 % 10) << 16) + \ |
239 |
| - (((X) / 100 % 10) << 8) \ |
240 |
| - : 0x30303030 + (((X) % 10) << 24) + \ |
241 |
| - (((X) / 10 % 10) << 16) + \ |
242 |
| - (((X) / 100 % 10) << 8) + \ |
243 |
| - (((X) / 1000 % 10) << 0)) |
244 |
| -#define BCD10K(X) \ |
245 |
| - ((X) < 10000 \ |
246 |
| - ? 0x20202020 \ |
247 |
| - : (X) < 100000 \ |
248 |
| - ? 0x30202020 + (((X) / 10000 % 10) << 24) \ |
249 |
| - : (X) < 1000000 \ |
250 |
| - ? 0x30302020 + (((X) / 10000 % 10) << 24) + \ |
251 |
| - (((X) / 100000 % 10) << 16) \ |
252 |
| - : (X) < 10000000 \ |
253 |
| - ? 0x30303020 + (((X) / 10000 % 10) << 24) + \ |
254 |
| - (((X) / 100000 % 10) << 16) + \ |
255 |
| - (((X) / 1000000 % 10) << 8) \ |
256 |
| - : (X) < 100000000 \ |
257 |
| - ? 0x30303030 + (((X) / 10000 % 10) << 24) + \ |
258 |
| - (((X) / 100000 % 10) << 16) + \ |
259 |
| - (((X) / 1000000 % 10) << 8) + \ |
260 |
| - (((X) / 10000000 % 10) << 0) \ |
261 |
| - : 0xffffffffffffffff) |
| 231 | +#define SHSTUB2(SYM, X) \ |
| 232 | + HIDDEN(SYM##_bcs0 = BCD_LEFT(X)); \ |
| 233 | + HIDDEN(SYM##_bcs1 = BCD_RIGHT(X)) |
| 234 | +#define BCD_SMEAR(X) ((X) + (X) * 10000) |
| 235 | +#define BCD_LEFT(X) \ |
| 236 | + (((X)) < 10000 ? BCD_RIGHT(BCD_SMEAR(X)) | 0x10 \ |
| 237 | + : (X) < 100000 ? BCD_RIGHT(BCD_SMEAR((X) / 10)) \ |
| 238 | + : (X) < 1000000 ? BCD_RIGHT(BCD_SMEAR((X) / 100)) \ |
| 239 | + : (X) < 10000000 ? BCD_RIGHT(BCD_SMEAR((X) / 1000)) \ |
| 240 | + : (X) < 100000000 ? BCD_RIGHT(BCD_SMEAR((X) / 10000)) \ |
| 241 | + : 0xffffffffffffffff) |
| 242 | +#define BCD_RIGHT(X) \ |
| 243 | + (((X)) < 10000 ? 0x20202020 \ |
| 244 | + : (X) < 100000 ? 0x20202030 + \ |
| 245 | + (X) % 10 \ |
| 246 | + : (X) < 1000000 ? 0x20203030 + \ |
| 247 | + ((X) / 10) % 10 + \ |
| 248 | + (X) % 10 * 0x100 \ |
| 249 | + : (X) < 10000000 ? 0x20303030 + \ |
| 250 | + ((X) / 100) % 10 + \ |
| 251 | + ((X) / 10) % 10 * 0x100 + \ |
| 252 | + (X) % 10 * 0x10000 \ |
| 253 | + : (X) < 100000000 ? 0x30303030 + \ |
| 254 | + ((X) / 1000) % 10 + \ |
| 255 | + ((X) / 100) % 10 * 0x100 + \ |
| 256 | + ((X) / 10) % 10 * 0x10000 + \ |
| 257 | + (X) % 10 * 0x1000000 \ |
| 258 | + : 0xffffffffffffffff) |
262 | 259 |
|
263 | 260 | #endif /* __ASSEMBLER__ */
|
264 | 261 | #endif /* APE_MACROS_H_ */
|
0 commit comments