aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amd64/sysv.c17
-rw-r--r--arm64/abi.c17
-rw-r--r--rv64/abi.c17
-rw-r--r--util.c2
4 files changed, 28 insertions, 25 deletions
diff --git a/amd64/sysv.c b/amd64/sysv.c
index 8a1fd2a..fd10bfd 100644
--- a/amd64/sysv.c
+++ b/amd64/sysv.c
@@ -656,9 +656,9 @@ void
amd64_sysv_abi(Fn *fn)
{
Blk *b;
- Ins *i, *i0, *ip;
+ Ins *i, *i0;
RAlloc *ral;
- int n, fa;
+ int n0, n1, ioff, fa;
for (b=fn->start; b; b=b->link)
b->visit = 0;
@@ -668,12 +668,13 @@ amd64_sysv_abi(Fn *fn)
if (!ispar(i->op))
break;
fa = selpar(fn, b->ins, i);
- n = b->nins - (i - b->ins) + (&insb[NIns] - curi);
- i0 = vnew(n, sizeof(Ins), PFn);
- ip = icpy(ip = i0, curi, &insb[NIns] - curi);
- ip = icpy(ip, i, &b->ins[b->nins] - i);
- b->nins = n;
- b->ins = i0;
+ n0 = &insb[NIns] - curi;
+ ioff = i - b->ins;
+ n1 = b->nins - ioff;
+ vgrow(&b->ins, n0+n1);
+ icpy(b->ins+n0, b->ins+ioff, n1);
+ icpy(b->ins, curi, n0);
+ b->nins = n0+n1;
/* lower calls, returns, and vararg instructions */
ral = 0;
diff --git a/arm64/abi.c b/arm64/abi.c
index 42af2be..7a2b6f9 100644
--- a/arm64/abi.c
+++ b/arm64/abi.c
@@ -729,9 +729,9 @@ void
arm64_abi(Fn *fn)
{
Blk *b;
- Ins *i, *i0, *ip;
+ Ins *i, *i0;
Insl *il;
- int n;
+ int n0, n1, ioff;
Params p;
for (b=fn->start; b; b=b->link)
@@ -742,12 +742,13 @@ arm64_abi(Fn *fn)
if (!ispar(i->op))
break;
p = selpar(fn, b->ins, i);
- n = b->nins - (i - b->ins) + (&insb[NIns] - curi);
- i0 = vnew(n, sizeof(Ins), PFn);
- ip = icpy(ip = i0, curi, &insb[NIns] - curi);
- ip = icpy(ip, i, &b->ins[b->nins] - i);
- b->nins = n;
- b->ins = i0;
+ n0 = &insb[NIns] - curi;
+ ioff = i - b->ins;
+ n1 = b->nins - ioff;
+ vgrow(&b->ins, n0+n1);
+ icpy(b->ins+n0, b->ins+ioff, n1);
+ icpy(b->ins, curi, n0);
+ b->nins = n0+n1;
/* lower calls, returns, and vararg instructions */
il = 0;
diff --git a/rv64/abi.c b/rv64/abi.c
index e7f2340..1c51bfc 100644
--- a/rv64/abi.c
+++ b/rv64/abi.c
@@ -587,9 +587,9 @@ void
rv64_abi(Fn *fn)
{
Blk *b;
- Ins *i, *i0, *ip;
+ Ins *i, *i0;
Insl *il;
- int n;
+ int n0, n1, ioff;
Params p;
for (b=fn->start; b; b=b->link)
@@ -600,12 +600,13 @@ rv64_abi(Fn *fn)
if (!ispar(i->op))
break;
p = selpar(fn, b->ins, i);
- n = b->nins - (i - b->ins) + (&insb[NIns] - curi);
- i0 = vnew(n, sizeof(Ins), PFn);
- ip = icpy(ip = i0, curi, &insb[NIns] - curi);
- ip = icpy(ip, i, &b->ins[b->nins] - i);
- b->nins = n;
- b->ins = i0;
+ n0 = &insb[NIns] - curi;
+ ioff = i - b->ins;
+ n1 = b->nins - ioff;
+ vgrow(&b->ins, n0+n1);
+ icpy(b->ins+n0, b->ins+ioff, n1);
+ icpy(b->ins, curi, n0);
+ b->nins = n0+n1;
/* lower calls, returns, and vararg instructions */
il = 0;
diff --git a/util.c b/util.c
index babaa58..5a0c89f 100644
--- a/util.c
+++ b/util.c
@@ -268,7 +268,7 @@ Ins *
icpy(Ins *d, Ins *s, ulong n)
{
if (n)
- memcpy(d, s, n * sizeof(Ins));
+ memmove(d, s, n * sizeof(Ins));
return d + n;
}