+++ /dev/null
-/** Simple printf implementation
- This stub has been replaced by the std printf_large / sprintf / vprintf
-*/
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#define STATIC
-
-static void _printn(unsigned u, unsigned base, char issigned, volatile void (*emitter)(char, void *), void *pData)
-{
- const char *_hex = "0123456789ABCDEF";
- if (issigned && ((int)u < 0)) {
- (*emitter)('-', pData);
- u = (unsigned)-((int)u);
- }
- if (u >= base)
- _printn(u/base, base, 0, emitter, pData);
- (*emitter)(_hex[u%base], pData);
-}
-
-STATIC void _printf(const char *format, volatile void (*emitter)(char, void *), void *pData, va_list va)
-{
- while (*format) {
- if (*format == '%') {
- switch (*++format) {
- case 'c': {
- char c = (char)va_arg(va, int);
- (*emitter)(c, pData);
- break;
- }
- case 'u':
- {
- unsigned u = va_arg(va, unsigned);
- _printn(u, 10, 0, emitter, pData);
- break;
- }
- case 'd':
- {
- unsigned u = va_arg(va, unsigned);
- _printn(u, 10, 1, emitter, pData);
- break;
- }
- case 'x':
- {
- unsigned u = va_arg(va, unsigned);
- _printn(u, 16, 0, emitter, pData);
- break;
- }
- case 's':
- {
- char *s = va_arg(va, char *);
- while (*s) {
- (*emitter)(*s, pData);
- s++;
- }
- }
- }
- }
- else {
- (*emitter)(*format, pData);
- }
- format++;
- }
-}
-
-void putchar(char c);
-
-STATIC void _char_emitter(char c, void *pData)
-{
- /* PENDING: Make the compiler happy. */
- pData = 0;
-
- putchar(c);
-}
-
-int printf(const char *format, ...)
-{
- va_list va;
- va_start(va, format);
-
- _printf(format, _char_emitter, NULL, va);
-
- /* PENDING: What to return? */
- return 0;
-}
-
-STATIC void _buf_emitter(char c, void *pData)
-{
- *((*((char **)pData)))++ = c;
-}
-
-int sprintf(char *pInto, const char *format, ...)
-{
- va_list va;
- va_start(va, format);
-
- _printf(format, _buf_emitter, &pInto, va);
- *pInto++ = '\0';
-
- /* PENDING: What to return? */
- return 0;
-}
}
}
-/* The problem is that we may have all three pairs used and they may
- be needed in a different order.
-
- Note: Have ex de,hl
-
- Combinations:
- hl = hl => unity, fine
- bc = bc
- de = de
-
- hl = hl hl = hl, swap de <=> bc
- bc = de
- de = bc
-
- hl = bc Worst case
- bc = de
- de = hl
-
- hl = bc de = de, swap bc <=> hl
- bc = hl
- de = de
-
- hl = de Worst case
- bc = hl
- de = bc
-
- hl = de bc = bc, swap hl <=> de
- bc = bc
- de = hl
-
- Break it down into:
- * Any pair = pair are done last
- * Any pair = iTemp are done last
- * Any swaps can be done any time
-
- A worst case:
- push p1
- p1 = p2
- p2 = p3
- pop p3
-
- So how do we detect the cases?
- How about a 3x3 matrix?
- source
- dest x x x x
- x x x x
- x x x x (Fourth for iTemp/other)
-
- First determin which mode to use by counting the number of unity and
- iTemp assigns.
- Three - any order
- Two - Assign the pair first, then the rest
- One - Swap the two, then the rest
- Zero - Worst case.
-*/
static void
setupForBuiltin3 (iCode *ic, int nparams, operand **pparams)
{
PAIR_ID ids[NUM_PAIRS][NUM_PAIRS];
PAIR_ID dest[3] = {
- PAIR_BC, PAIR_HL, PAIR_DE
+ PAIR_DE, PAIR_HL, PAIR_BC
};
int i, j, nunity = 0;
memset (ids, PAIR_INVALID, sizeof (ids));
/* Sanity checks */
wassert (nparams == 3);
- /* First save everything that needs to be saved. */
- _saveRegsForCall (ic, 0);
-
- /* Loading HL first means that DE is always fine. */
for (i = 0; i < nparams; i++)
{
aopOp (pparams[i], ic, FALSE, FALSE);
}
else if (nunity == 2)
{
- /* One is assigned. Pull it out and assign. */
+ /* Two are OK. Assign the other one. */
for (i = 0; i < 3; i++)
{
for (j = 0; j < NUM_PAIRS; j++)
}
else if (nunity == 1)
{
- /* Find the pairs to swap. */
+ /* One is OK. Find the other two. */
for (i = 0; i < 3; i++)
{
for (j = 0; j < NUM_PAIRS; j++)
{
if (j == PAIR_INVALID || j == dest[i])
{
- /* Keep looking. */
+ /* This one is OK. */
}
else
{
- _swap (j, dest[i]);
- goto done;
+ /* Found one. */
+ if(ids[j][dest[i]] == TRUE)
+ {
+ /* Just swap. */
+ _swap (j, dest[i]);
+ goto done;
+ }
+ else
+ {
+ fetchPair (dest[i], AOP (pparams[i]));
+ continue;
+ }
}
}
}
}
}
-static void
+/*static void
genBuiltInStrcpy (iCode *ic, int nParams, operand **pparams)
{
operand *from, *to;
deInUse = bitVectBitValue (ic->rMask, D_IDX) || bitVectBitValue(ic->rMask, E_IDX);
+ _saveRegsForCall (ic, 0);
+
setupForBuiltin3 (ic, nParams, pparams);
label = newiTempLabel(NULL);
freeAsmop (from, NULL, ic->next);
freeAsmop (to, NULL, ic);
-}
+}*/
static void
genBuiltInMemcpy (iCode *ic, int nParams, operand **pparams)
{
operand *from, *to, *count;
- bool deInUse;
wassertl (nParams == 3, "Built-in memcpy must have three parameters");
to = pparams[2];
from = pparams[1];
count = pparams[0];
- deInUse = bitVectBitValue (ic->rMask, D_IDX) || bitVectBitValue(ic->rMask, E_IDX);
+ _saveRegsForCall (ic, 0);
setupForBuiltin3 (ic, nParams, pparams);
/* which function is it */
bif = OP_SYMBOL(IC_LEFT(bi_iCode));
- if (strcmp(bif->name,"__builtin_strcpy")==0)
+ /*if (strcmp(bif->name,"__builtin_strcpy")==0)
{
genBuiltInStrcpy(bi_iCode, nbi_parms, bi_parms);
}
- else if (strcmp(bif->name,"__builtin_memcpy")==0)
+ else*/ if (strcmp(bif->name,"__builtin_memcpy")==0)
{
genBuiltInMemcpy(bi_iCode, nbi_parms, bi_parms);
}