1
0
mirror of https://github.com/golang/go synced 2024-10-02 16:28:34 -06:00

cmd/internal/obj/arm64: fix assemble hlt/hvc/smc/brk/clrex bug

When instruction has only one argument, Go parser saves the
argument value into prog.From without any special handling.
But assembler gets the argument value from prog.To.

The fix adds special handling for CLREX and puts other instructions
arguments value into prog.From.

Uncomment hlt/hvc/smc/brk/dcps1/dcps2/dcps3/clrex test cases.

Fixes #20765

Change-Id: I1fc0d2faafb19b537cab5a665bd4af56c3a2c925
Reviewed-on: https://go-review.googlesource.com/78275
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
fanzha02 2017-06-14 03:42:36 +00:00 committed by Cherry Zhang
parent 337f04bd6c
commit 436f2d8d97
3 changed files with 14 additions and 14 deletions

View File

@ -57,7 +57,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
CALL -1(PC) // ffffff97
CALL (R15) // e0013fd6
JMP (R29) // a0031fd6
// BRK $35943 // e08c31d4
BRK $35943 // e08c31d4
CBNZW R2, -1(PC) // e2ffff35
CBNZ R7, -1(PC) // e7ffffb5
CBZW R15, -1(PC) // efffff34
@ -81,8 +81,8 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
CINVW EQ, R2, R17 // 5110825a
CINV VS, R12, R7 // 87718cda
CINV VS, R30, R30 // de739eda
// CLREX $4 // 5f3403d5
// CLREX $0 // 5f3003d5
CLREX $4 // 5f3403d5
CLREX $0 // 5f3003d5
CLSW R15, R6 // e615c05a
CLS R15, ZR // ff15c0da
CLZW R1, R14 // 2e10c05a
@ -128,9 +128,9 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
CSNEGW HS, R16, R29, R10 // 0a269d5a
CSNEG NE, R21, R18, R11 // ab1692da
//TODO DC
// DCPS1 $11378 // 418ea5d4
// DCPS2 $10699 // 6239a5d4
// DCPS3 $24415 // e3ebabd4
DCPS1 $11378 // 418ea5d4
DCPS2 $10699 // 6239a5d4
DCPS3 $24415 // e3ebabd4
DMB $1 // bf3103d5
DMB $0 // bf3003d5
DRPS // e003bfd6
@ -145,8 +145,8 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
EXTR $35, R22, R12, R8 // 888dd693
SEVL // bf2003d5
HINT $6 // df2003d5
// HLT $65509 // a0fc5fd4
// HVC $61428 // 82fe1dd4
HLT $65509 // a0fc5fd4
HVC $61428 // 82fe1dd4
ISB $1 // df3103d5
ISB $15 // df3f03d5
LDARW (R12), R29 // 9dfddf88
@ -304,7 +304,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
SMNEGL R26, R3, R15 // 6ffc3a9b
SMULH R17, R21, R21 // b57e519b
SMULL R0, R5, R0 // a07c209b
// SMC $37977 // 238b12d4
SMC $37977 // 238b12d4
STLRW R16, (R22) // d0fe9f88
STLR R3, (R24) // 03ff9fc8
//TODO STLRB R11, (R22) // cbfe9f08

View File

@ -271,7 +271,7 @@ var optab = []Optab{
{ALSL, C_VCON, C_NONE, C_REG, 8, 4, 0, 0, 0},
{ALSL, C_REG, C_NONE, C_REG, 9, 4, 0, 0, 0},
{ALSL, C_REG, C_REG, C_REG, 9, 4, 0, 0, 0},
{ASVC, C_NONE, C_NONE, C_VCON, 10, 4, 0, 0, 0},
{ASVC, C_VCON, C_NONE, C_NONE, 10, 4, 0, 0, 0},
{ASVC, C_NONE, C_NONE, C_NONE, 10, 4, 0, 0, 0},
{ADWORD, C_NONE, C_NONE, C_VCON, 11, 8, 0, 0, 0},
{ADWORD, C_NONE, C_NONE, C_LEXT, 11, 8, 0, 0, 0},
@ -1914,8 +1914,8 @@ func buildop(ctxt *obj.Link) {
break
case ASVC:
oprangeset(AHLT, t)
oprangeset(AHVC, t)
oprangeset(AHLT, t)
oprangeset(ASMC, t)
oprangeset(ABRK, t)
oprangeset(ADCPS1, t)
@ -2301,8 +2301,8 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
case 10: /* brk/hvc/.../svc [$con] */
o1 = c.opimm(p, p.As)
if p.To.Type != obj.TYPE_NONE {
o1 |= uint32((p.To.Offset & 0xffff) << 5)
if p.From.Type != obj.TYPE_NONE {
o1 |= uint32((p.From.Offset & 0xffff) << 5)
}
case 11: /* dword */

View File

@ -813,7 +813,7 @@ var unaryDst = map[obj.As]bool{
ADWORD: true,
ABL: true,
AB: true,
ASVC: true,
ACLREX: true,
}
var Linkarm64 = obj.LinkArch{