diff options
author | Ori Bernstein <ori@eigenstate.org> | 2016-02-13 15:31:03 -0800 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2016-02-13 15:31:03 -0800 |
commit | 56d1f1bccd4f943b43e5b8043dd63a17ceb2b2b1 (patch) | |
tree | b6c2e0e797be2801129cd552b3cb9c0ce916e43f /6/isel.c | |
parent | ef16012a85da92aa8e7fdb7890e2f7a88364c9bd (diff) | |
download | mc-56d1f1bccd4f943b43e5b8043dd63a17ceb2b2b1.tar.gz |
Save regs correctly around rep movs
Diffstat (limited to '6/isel.c')
-rw-r--r-- | 6/isel.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -405,6 +405,7 @@ static const Mode szmodes[] = { static void blit(Isel *s, Loc *to, Loc *from, size_t dstoff, size_t srcoff, size_t sz, size_t align) { size_t i, modesz; + Loc *savsi, *savdi, *savcx; /* pointers to src, dst */ Loc *sp, *dp, *len; /* pointers to src, dst */ Loc *tmp, *src, *dst; /* source memory, dst memory */ @@ -429,7 +430,13 @@ static void blit(Isel *s, Loc *to, Loc *from, size_t dstoff, size_t srcoff, size } } } else { + savsi = locreg(ModeQ); + savdi = locreg(ModeQ); + savcx = locreg(ModeQ); len = loclit(sz, ModeQ); + g(s, Imov, locphysreg(Rrsi), savsi); + g(s, Imov, locphysreg(Rrdi), savdi); + g(s, Imov, locphysreg(Rrcx), savcx); sp = newr(s, from); dp = newr(s, to); @@ -446,6 +453,9 @@ static void blit(Isel *s, Loc *to, Loc *from, size_t dstoff, size_t srcoff, size else g(s, Imov, dp, locphysreg(Rrdi), NULL); g(s, Irepmovsb, NULL); + g(s, Imov, savsi, locphysreg(Rrsi)); + g(s, Imov, savdi, locphysreg(Rrdi)); + g(s, Imov, savcx, locphysreg(Rrcx)); } } |