Commit 26d62b4c authored by Ben Shi's avatar Ben Shi

cmd/internal/obj/arm64: add SWPALD/SWPALW/SWPALH/SWPALB

Those new instructions have acquire/release semantics, besides
normal atomic SWPD/SWPW/SWPH/SWPB.

Change-Id: I24821a4d21aebc342897ae52903aef612c8d8a4a
Reviewed-on: https://go-review.googlesource.com/128476
Run-TryBot: Ben Shi <powerman1st@163.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
parent 285747b9
...@@ -74,6 +74,7 @@ func IsARM64STLXR(op obj.As) bool { ...@@ -74,6 +74,7 @@ func IsARM64STLXR(op obj.As) bool {
arm64.ASTXRB, arm64.ASTXRH, arm64.ASTXRW, arm64.ASTXR, arm64.ASTXRB, arm64.ASTXRH, arm64.ASTXRW, arm64.ASTXR,
arm64.ASTXP, arm64.ASTXPW, arm64.ASTLXP, arm64.ASTLXPW, arm64.ASTXP, arm64.ASTXPW, arm64.ASTLXP, arm64.ASTLXPW,
arm64.ASWPB, arm64.ASWPH, arm64.ASWPW, arm64.ASWPD, arm64.ASWPB, arm64.ASWPH, arm64.ASWPW, arm64.ASWPD,
arm64.ASWPALB, arm64.ASWPALH, arm64.ASWPALW, arm64.ASWPALD,
arm64.ALDADDB, arm64.ALDADDH, arm64.ALDADDW, arm64.ALDADDD, arm64.ALDADDB, arm64.ALDADDH, arm64.ALDADDW, arm64.ALDADDD,
arm64.ALDANDB, arm64.ALDANDH, arm64.ALDANDW, arm64.ALDANDD, arm64.ALDANDB, arm64.ALDANDH, arm64.ALDANDW, arm64.ALDANDD,
arm64.ALDEORB, arm64.ALDEORH, arm64.ALDEORW, arm64.ALDEORD, arm64.ALDEORB, arm64.ALDEORH, arm64.ALDEORW, arm64.ALDEORD,
......
...@@ -572,6 +572,14 @@ again: ...@@ -572,6 +572,14 @@ again:
SWPH R5, (RSP), R7 // e7832578 SWPH R5, (RSP), R7 // e7832578
SWPB R5, (R6), R7 // c7802538 SWPB R5, (R6), R7 // c7802538
SWPB R5, (RSP), R7 // e7832538 SWPB R5, (RSP), R7 // e7832538
SWPALD R5, (R6), R7 // c780e5f8
SWPALD R5, (RSP), R7 // e783e5f8
SWPALW R5, (R6), R7 // c780e5b8
SWPALW R5, (RSP), R7 // e783e5b8
SWPALH R5, (R6), R7 // c780e578
SWPALH R5, (RSP), R7 // e783e578
SWPALB R5, (R6), R7 // c780e538
SWPALB R5, (RSP), R7 // e783e538
LDADDD R5, (R6), R7 // c70025f8 LDADDD R5, (R6), R7 // c70025f8
LDADDD R5, (RSP), R7 // e70325f8 LDADDD R5, (RSP), R7 // e70325f8
LDADDW R5, (R6), R7 // c70025b8 LDADDW R5, (R6), R7 // c70025b8
......
...@@ -774,9 +774,13 @@ const ( ...@@ -774,9 +774,13 @@ const (
AMOVPSW AMOVPSW
AMOVPW AMOVPW
ASWPD ASWPD
ASWPALD
ASWPW ASWPW
ASWPALW
ASWPH ASWPH
ASWPALH
ASWPB ASWPB
ASWPALB
ABEQ ABEQ
ABNE ABNE
ABCS ABCS
......
...@@ -275,9 +275,13 @@ var Anames = []string{ ...@@ -275,9 +275,13 @@ var Anames = []string{
"MOVPSW", "MOVPSW",
"MOVPW", "MOVPW",
"SWPD", "SWPD",
"SWPALD",
"SWPW", "SWPW",
"SWPALW",
"SWPH", "SWPH",
"SWPALH",
"SWPB", "SWPB",
"SWPALB",
"BEQ", "BEQ",
"BNE", "BNE",
"BCS", "BCS",
......
...@@ -2008,9 +2008,13 @@ func buildop(ctxt *obj.Link) { ...@@ -2008,9 +2008,13 @@ func buildop(ctxt *obj.Link) {
oprangeset(AMOVZW, t) oprangeset(AMOVZW, t)
case ASWPD: case ASWPD:
oprangeset(ASWPALD, t)
oprangeset(ASWPB, t) oprangeset(ASWPB, t)
oprangeset(ASWPH, t) oprangeset(ASWPH, t)
oprangeset(ASWPW, t) oprangeset(ASWPW, t)
oprangeset(ASWPALB, t)
oprangeset(ASWPALH, t)
oprangeset(ASWPALW, t)
oprangeset(ALDADDALD, t) oprangeset(ALDADDALD, t)
oprangeset(ALDADDALW, t) oprangeset(ALDADDALW, t)
oprangeset(ALDADDB, t) oprangeset(ALDADDB, t)
...@@ -3383,19 +3387,19 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { ...@@ -3383,19 +3387,19 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
rt := p.RegTo2 rt := p.RegTo2
rb := p.To.Reg rb := p.To.Reg
switch p.As { switch p.As {
case ASWPD, ALDADDALD, ALDADDD, ALDANDD, ALDEORD, ALDORD: // 64-bit case ASWPD, ASWPALD, ALDADDALD, ALDADDD, ALDANDD, ALDEORD, ALDORD: // 64-bit
o1 = 3 << 30 o1 = 3 << 30
case ASWPW, ALDADDALW, ALDADDW, ALDANDW, ALDEORW, ALDORW: // 32-bit case ASWPW, ASWPALW, ALDADDALW, ALDADDW, ALDANDW, ALDEORW, ALDORW: // 32-bit
o1 = 2 << 30 o1 = 2 << 30
case ASWPH, ALDADDH, ALDANDH, ALDEORH, ALDORH: // 16-bit case ASWPH, ASWPALH, ALDADDH, ALDANDH, ALDEORH, ALDORH: // 16-bit
o1 = 1 << 30 o1 = 1 << 30
case ASWPB, ALDADDB, ALDANDB, ALDEORB, ALDORB: // 8-bit case ASWPB, ASWPALB, ALDADDB, ALDANDB, ALDEORB, ALDORB: // 8-bit
o1 = 0 << 30 o1 = 0 << 30
default: default:
c.ctxt.Diag("illegal instruction: %v\n", p) c.ctxt.Diag("illegal instruction: %v\n", p)
} }
switch p.As { switch p.As {
case ASWPD, ASWPW, ASWPH, ASWPB: case ASWPD, ASWPW, ASWPH, ASWPB, ASWPALD, ASWPALW, ASWPALH, ASWPALB:
o1 |= 0x20 << 10 o1 |= 0x20 << 10
case ALDADDALD, ALDADDALW, ALDADDD, ALDADDW, ALDADDH, ALDADDB: case ALDADDALD, ALDADDALW, ALDADDD, ALDADDW, ALDADDH, ALDADDB:
o1 |= 0x00 << 10 o1 |= 0x00 << 10
...@@ -3407,7 +3411,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { ...@@ -3407,7 +3411,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
o1 |= 0x0c << 10 o1 |= 0x0c << 10
} }
switch p.As { switch p.As {
case ALDADDALD, ALDADDALW: case ALDADDALD, ALDADDALW, ASWPALD, ASWPALW, ASWPALH, ASWPALB:
o1 |= 3 << 22 o1 |= 3 << 22
} }
o1 |= 0x1c1<<21 | uint32(rs&31)<<16 | uint32(rb&31)<<5 | uint32(rt&31) o1 |= 0x1c1<<21 | uint32(rs&31)<<16 | uint32(rb&31)<<5 | uint32(rt&31)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment