cgen: materialise str-def operands in streq pushes
A str `def` has no name(SB) header; the streq push arms read a frame slot that does not exist. Load the literal through cgexpr (AX=ptr, BX=len) instead. Both stages.
This commit is contained in:
@@ -4925,6 +4925,12 @@ cgexpr(Cg *c, Node *n, Local *locals)
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
ins2(c, A_MOVQ, amem(D_BX, 0), areg(D_AX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
} else if (off == 0 && def_isanydef(n->rhs->str)) {
|
||||
/* A str `def` has no name(SB) header: cgexpr
|
||||
* materialises its literal as AX=ptr, BX=len. */
|
||||
cgexpr(c, n->rhs, locals);
|
||||
ins1(c, A_PUSHQ, areg(D_BX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
} else {
|
||||
ins2(c, A_MOVQ, amem(D_BP, off + 8), areg(D_AX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
@@ -4948,6 +4954,10 @@ cgexpr(Cg *c, Node *n, Local *locals)
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
ins2(c, A_MOVQ, amem(D_BX, 0), areg(D_AX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
} else if (off == 0 && def_isanydef(n->lhs->str)) {
|
||||
cgexpr(c, n->lhs, locals);
|
||||
ins1(c, A_PUSHQ, areg(D_BX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
} else {
|
||||
ins2(c, A_MOVQ, amem(D_BP, off + 8), areg(D_AX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
|
||||
Reference in New Issue
Block a user