improved structure assignments

This commit is contained in:
ceriel 1991-08-26 14:26:07 +00:00
parent 57e6cad135
commit 2526e11a03
2 changed files with 40 additions and 3 deletions

View file

@ -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

View file

@ -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));