improved structure assignments
This commit is contained in:
parent
57e6cad135
commit
2526e11a03
|
@ -20,6 +20,7 @@
|
||||||
#include "Lpars.h"
|
#include "Lpars.h"
|
||||||
extern arith NewLocal();
|
extern arith NewLocal();
|
||||||
#define LocalPtrVar() NewLocal(pointer_size, pointer_align, reg_pointer, REGISTER)
|
#define LocalPtrVar() NewLocal(pointer_size, pointer_align, reg_pointer, REGISTER)
|
||||||
|
#define LocalIntVar() NewLocal(int_size, int_align, reg_any, REGISTER)
|
||||||
#endif STB
|
#endif STB
|
||||||
|
|
||||||
/* Because EM does not support the loading and storing of
|
/* Because EM does not support the loading and storing of
|
||||||
|
@ -137,18 +138,48 @@ load_block(sz, al)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copy_block(sz, al)
|
||||||
|
arith sz;
|
||||||
|
int al;
|
||||||
|
{
|
||||||
|
|
||||||
|
if (suitable_sz(sz, al))
|
||||||
|
C_blm(sz);
|
||||||
|
else {
|
||||||
|
#ifndef STB
|
||||||
|
arith src, dst;
|
||||||
|
|
||||||
|
/* allocate two pointer temporaries */
|
||||||
|
src = LocalPtrVar();
|
||||||
|
dst = LocalPtrVar();
|
||||||
|
|
||||||
|
StoreLocal(src, pointer_size);
|
||||||
|
StoreLocal(dst, pointer_size);
|
||||||
|
copy_loop(sz, src, dst);
|
||||||
|
FreeLocal(dst);
|
||||||
|
FreeLocal(src);
|
||||||
|
#else STB
|
||||||
|
C_loc(sz); /* # bytes to copy */
|
||||||
|
C_cal("__stb"); /* library copy routine */
|
||||||
|
C_asp(int_size + pointer_size + pointer_size);
|
||||||
|
#endif STB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef STB
|
#ifndef STB
|
||||||
copy_loop(sz, src, dst)
|
copy_loop(sz, src, dst)
|
||||||
arith sz, src, dst;
|
arith sz, src, dst;
|
||||||
{
|
{
|
||||||
/* generate inline byte-copy loop */
|
/* generate inline byte-copy loop */
|
||||||
label l_cont = text_label(), l_stop = text_label();
|
label l_cont = text_label(), l_stop = text_label();
|
||||||
|
arith tmp_sz = LocalIntVar();
|
||||||
|
|
||||||
C_loc(sz); /* amount of bytes */
|
C_loc(sz); /* amount of bytes */
|
||||||
|
StoreLocal(tmp_sz, int_size);
|
||||||
C_df_ilb(l_cont);
|
C_df_ilb(l_cont);
|
||||||
C_dup(word_size);
|
LoadLocal(tmp_sz, int_size);
|
||||||
C_zle(l_stop);
|
C_zle(l_stop);
|
||||||
C_dec();
|
C_del(tmp_sz);
|
||||||
LoadLocal(src, pointer_size);
|
LoadLocal(src, pointer_size);
|
||||||
C_dup(pointer_size);
|
C_dup(pointer_size);
|
||||||
C_adp((arith)1);
|
C_adp((arith)1);
|
||||||
|
@ -161,7 +192,7 @@ copy_loop(sz, src, dst)
|
||||||
C_sti((arith)1);
|
C_sti((arith)1);
|
||||||
C_bra(l_cont);
|
C_bra(l_cont);
|
||||||
C_df_ilb(l_stop);
|
C_df_ilb(l_stop);
|
||||||
C_asp(word_size);
|
FreeLocal(tmp_sz);
|
||||||
}
|
}
|
||||||
#endif STB
|
#endif STB
|
||||||
|
|
||||||
|
|
|
@ -348,6 +348,12 @@ EVAL(expr, val, code, true_label, false_label)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif NOBITFIELD
|
#endif NOBITFIELD
|
||||||
|
if (is_struct_or_union(tp->tp_fund) && ! gencode) {
|
||||||
|
EVAL(right, LVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||||
|
EVAL(left, LVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||||
|
copy_block(tp->tp_size, tp->tp_align);
|
||||||
|
break;
|
||||||
|
}
|
||||||
EVAL(right, RVAL, TRUE, NO_LABEL, NO_LABEL);
|
EVAL(right, RVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||||
if (gencode && val == RVAL)
|
if (gencode && val == RVAL)
|
||||||
C_dup(ATW(tp->tp_size));
|
C_dup(ATW(tp->tp_size));
|
||||||
|
|
Loading…
Reference in a new issue