Commit 6966b675 authored by Michael Munday's avatar Michael Munday

cmd/asm: add 'insert program mask' instruction for s390x

This CL adds the 'insert program mask' (IPM) instruction to s390x.
IPM stores the current program mask (which contains the condition
code) into a general purpose register.

This instruction will be useful when implementing intrinsics for
the arithmetic functions in the math/bits package. We can also
potentially use it to convert some condition codes into bool
values.

The condition code can be saved and restored using an instruction
sequence such as:

  IPM  R4          // save condition code to R4
  ...
  TMLH R4, $0x3000 // restore condition code from R4

We can also use IPM to save the carry bit to a register using an
instruction sequence such as:

  IPM     R4                   // save condition code to R4
  RISBLGZ $31, $31, $3, R4, R4 // isolate carry bit in R4

Change-Id: I169d450b6ea1a7ff8c0286115ddc42618da8a2f4
Reviewed-on: https://go-review.googlesource.com/c/go/+/165997
Run-TryBot: Michael Munday <mike.munday@ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 95f18757
...@@ -219,6 +219,9 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16- ...@@ -219,6 +219,9 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16-
TMLH R3, $0 // a7300000 TMLH R3, $0 // a7300000
TMLL R4, $32768 // a7418000 TMLL R4, $32768 // a7418000
IPM R3 // b2220030
IPM R12 // b22200c0
BNE 0(PC) // a7740000 BNE 0(PC) // a7740000
BEQ 0(PC) // a7840000 BEQ 0(PC) // a7840000
BLT 0(PC) // a7440000 BLT 0(PC) // a7440000
......
...@@ -366,6 +366,9 @@ const ( ...@@ -366,6 +366,9 @@ const (
ATMLH ATMLH
ATMLL ATMLL
// insert program mask
AIPM
// compare and swap // compare and swap
ACS ACS
ACSG ACSG
......
...@@ -120,6 +120,7 @@ var Anames = []string{ ...@@ -120,6 +120,7 @@ var Anames = []string{
"TMHL", "TMHL",
"TMLH", "TMLH",
"TMLL", "TMLL",
"IPM",
"CS", "CS",
"CSG", "CSG",
"SYNC", "SYNC",
......
...@@ -260,6 +260,9 @@ var optab = []Optab{ ...@@ -260,6 +260,9 @@ var optab = []Optab{
// test under mask // test under mask
Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91, 0}, Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91, 0},
// insert program mask
Optab{AIPM, C_REG, C_NONE, C_NONE, C_NONE, 92, 0},
// 32-bit access registers // 32-bit access registers
Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68, 0},
Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68, 0},
...@@ -3766,6 +3769,9 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { ...@@ -3766,6 +3769,9 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
} }
zRI(opcode, uint32(p.From.Reg), uint32(c.vregoff(&p.To)), asm) zRI(opcode, uint32(p.From.Reg), uint32(c.vregoff(&p.To)), asm)
case 92: // insert program mask
zRRE(op_IPM, uint32(p.From.Reg), 0, asm)
case 93: // GOT lookup case 93: // GOT lookup
v := c.vregoff(&p.To) v := c.vregoff(&p.To)
if v != 0 { if v != 0 {
......
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