mirror of
https://codeberg.org/superseriousbusiness/gotosocial.git
synced 2024-12-27 03:18:16 +03:00
5044 lines
174 KiB
Go
5044 lines
174 KiB
Go
|
// Based on cmd/internal/obj/ppc64/asm9.go.
|
||
|
//
|
||
|
// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
|
||
|
// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
|
||
|
// Portions Copyright © 1997-1999 Vita Nuova Limited
|
||
|
// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
|
||
|
// Portions Copyright © 2004,2006 Bruce Ellis
|
||
|
// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
|
||
|
// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
|
||
|
// Portions Copyright © 2009 The Go Authors. All rights reserved.
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
// of this software and associated documentation files (the "Software"), to deal
|
||
|
// in the Software without restriction, including without limitation the rights
|
||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
// copies of the Software, and to permit persons to whom the Software is
|
||
|
// furnished to do so, subject to the following conditions:
|
||
|
//
|
||
|
// The above copyright notice and this permission notice shall be included in
|
||
|
// all copies or substantial portions of the Software.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
// THE SOFTWARE.
|
||
|
|
||
|
package s390x
|
||
|
|
||
|
import (
|
||
|
"github.com/twitchyliquid64/golang-asm/obj"
|
||
|
"github.com/twitchyliquid64/golang-asm/objabi"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"math"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
// ctxtz holds state while assembling a single function.
|
||
|
// Each function gets a fresh ctxtz.
|
||
|
// This allows for multiple functions to be safely concurrently assembled.
|
||
|
type ctxtz struct {
|
||
|
ctxt *obj.Link
|
||
|
newprog obj.ProgAlloc
|
||
|
cursym *obj.LSym
|
||
|
autosize int32
|
||
|
instoffset int64
|
||
|
pc int64
|
||
|
}
|
||
|
|
||
|
// instruction layout.
|
||
|
const (
|
||
|
funcAlign = 16
|
||
|
)
|
||
|
|
||
|
type Optab struct {
|
||
|
as obj.As // opcode
|
||
|
i uint8 // handler index
|
||
|
a1 uint8 // From
|
||
|
a2 uint8 // Reg
|
||
|
a3 uint8 // RestArgs[0]
|
||
|
a4 uint8 // RestArgs[1]
|
||
|
a5 uint8 // RestArgs[2]
|
||
|
a6 uint8 // To
|
||
|
}
|
||
|
|
||
|
var optab = []Optab{
|
||
|
// zero-length instructions
|
||
|
{i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE},
|
||
|
{i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE},
|
||
|
{i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON},
|
||
|
{i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR},
|
||
|
{i: 0, as: obj.ANOP},
|
||
|
{i: 0, as: obj.ANOP, a1: C_SAUTO},
|
||
|
|
||
|
// move register
|
||
|
{i: 1, as: AMOVD, a1: C_REG, a6: C_REG},
|
||
|
{i: 1, as: AMOVB, a1: C_REG, a6: C_REG},
|
||
|
{i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG},
|
||
|
{i: 1, as: AMOVW, a1: C_REG, a6: C_REG},
|
||
|
{i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG},
|
||
|
{i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG},
|
||
|
|
||
|
// load constant
|
||
|
{i: 26, as: AMOVD, a1: C_LACON, a6: C_REG},
|
||
|
{i: 26, as: AMOVW, a1: C_LACON, a6: C_REG},
|
||
|
{i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG},
|
||
|
{i: 3, as: AMOVD, a1: C_DCON, a6: C_REG},
|
||
|
{i: 3, as: AMOVW, a1: C_DCON, a6: C_REG},
|
||
|
{i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG},
|
||
|
{i: 3, as: AMOVB, a1: C_DCON, a6: C_REG},
|
||
|
{i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG},
|
||
|
|
||
|
// store constant
|
||
|
{i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO},
|
||
|
{i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG},
|
||
|
{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG},
|
||
|
|
||
|
// store
|
||
|
{i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO},
|
||
|
{i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG},
|
||
|
{i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR},
|
||
|
{i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR},
|
||
|
{i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR},
|
||
|
{i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR},
|
||
|
{i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR},
|
||
|
|
||
|
// load
|
||
|
{i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG},
|
||
|
{i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG},
|
||
|
{i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG},
|
||
|
{i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG},
|
||
|
{i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG},
|
||
|
|
||
|
// interlocked load and op
|
||
|
{i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG},
|
||
|
|
||
|
// integer arithmetic
|
||
|
{i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 2, as: AADD, a1: C_REG, a6: C_REG},
|
||
|
{i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG},
|
||
|
{i: 22, as: AADD, a1: C_LCON, a6: C_REG},
|
||
|
{i: 12, as: AADD, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 12, as: AADD, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG},
|
||
|
{i: 21, as: ASUB, a1: C_LCON, a6: C_REG},
|
||
|
{i: 12, as: ASUB, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 4, as: AMULHD, a1: C_REG, a6: C_REG},
|
||
|
{i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 62, as: AMLGR, a1: C_REG, a6: C_REG},
|
||
|
{i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 2, as: ADIVW, a1: C_REG, a6: C_REG},
|
||
|
{i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 10, as: ASUB, a1: C_REG, a6: C_REG},
|
||
|
{i: 47, as: ANEG, a1: C_REG, a6: C_REG},
|
||
|
{i: 47, as: ANEG, a6: C_REG},
|
||
|
|
||
|
// integer logical
|
||
|
{i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 6, as: AAND, a1: C_REG, a6: C_REG},
|
||
|
{i: 23, as: AAND, a1: C_LCON, a6: C_REG},
|
||
|
{i: 12, as: AAND, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 12, as: AAND, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 6, as: AANDW, a1: C_REG, a6: C_REG},
|
||
|
{i: 24, as: AANDW, a1: C_LCON, a6: C_REG},
|
||
|
{i: 12, as: AANDW, a1: C_LOREG, a6: C_REG},
|
||
|
{i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG},
|
||
|
{i: 7, as: ASLD, a1: C_REG, a6: C_REG},
|
||
|
{i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG},
|
||
|
{i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG},
|
||
|
{i: 7, as: ASLD, a1: C_SCON, a6: C_REG},
|
||
|
{i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG},
|
||
|
|
||
|
// compare and swap
|
||
|
{i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG},
|
||
|
|
||
|
// floating point
|
||
|
{i: 32, as: AFADD, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 33, as: AFABS, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 33, as: AFABS, a6: C_FREG},
|
||
|
{i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG},
|
||
|
{i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG},
|
||
|
{i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG},
|
||
|
{i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG},
|
||
|
{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO},
|
||
|
{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG},
|
||
|
{i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR},
|
||
|
{i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG},
|
||
|
{i: 81, as: ALDGR, a1: C_REG, a6: C_FREG},
|
||
|
{i: 81, as: ALGDR, a1: C_FREG, a6: C_REG},
|
||
|
{i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG},
|
||
|
{i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG},
|
||
|
{i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG},
|
||
|
{i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG},
|
||
|
{i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON},
|
||
|
|
||
|
// load symbol address (plus offset)
|
||
|
{i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG},
|
||
|
{i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG},
|
||
|
{i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG},
|
||
|
{i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG},
|
||
|
|
||
|
// system call
|
||
|
{i: 5, as: ASYSCALL},
|
||
|
{i: 77, as: ASYSCALL, a1: C_SCON},
|
||
|
|
||
|
// branch
|
||
|
{i: 16, as: ABEQ, a6: C_SBRA},
|
||
|
{i: 16, as: ABRC, a1: C_SCON, a6: C_SBRA},
|
||
|
{i: 11, as: ABR, a6: C_LBRA},
|
||
|
{i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA},
|
||
|
{i: 18, as: ABR, a6: C_REG},
|
||
|
{i: 18, as: ABR, a1: C_REG, a6: C_REG},
|
||
|
{i: 15, as: ABR, a6: C_ZOREG},
|
||
|
{i: 15, as: ABC, a6: C_ZOREG},
|
||
|
|
||
|
// compare and branch
|
||
|
{i: 89, as: ACGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
|
||
|
{i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
|
||
|
{i: 89, as: ACLGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
|
||
|
{i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
|
||
|
{i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
|
||
|
{i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_SCON, a6: C_SBRA},
|
||
|
{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA},
|
||
|
{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA},
|
||
|
{i: 90, as: ACLGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
|
||
|
{i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA},
|
||
|
|
||
|
// branch on count
|
||
|
{i: 41, as: ABRCT, a1: C_REG, a6: C_SBRA},
|
||
|
{i: 41, as: ABRCTG, a1: C_REG, a6: C_SBRA},
|
||
|
|
||
|
// move on condition
|
||
|
{i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG},
|
||
|
|
||
|
// load on condition
|
||
|
{i: 25, as: ALOCGR, a1: C_SCON, a2: C_REG, a6: C_REG},
|
||
|
|
||
|
// find leftmost one
|
||
|
{i: 8, as: AFLOGR, a1: C_REG, a6: C_REG},
|
||
|
|
||
|
// population count
|
||
|
{i: 9, as: APOPCNT, a1: C_REG, a6: C_REG},
|
||
|
|
||
|
// compare
|
||
|
{i: 70, as: ACMP, a1: C_REG, a6: C_REG},
|
||
|
{i: 71, as: ACMP, a1: C_REG, a6: C_LCON},
|
||
|
{i: 70, as: ACMPU, a1: C_REG, a6: C_REG},
|
||
|
{i: 71, as: ACMPU, a1: C_REG, a6: C_LCON},
|
||
|
{i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG},
|
||
|
{i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG},
|
||
|
|
||
|
// test under mask
|
||
|
{i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON},
|
||
|
|
||
|
// insert program mask
|
||
|
{i: 92, as: AIPM, a1: C_REG},
|
||
|
|
||
|
// set program mask
|
||
|
{i: 76, as: ASPM, a1: C_REG},
|
||
|
|
||
|
// 32-bit access registers
|
||
|
{i: 68, as: AMOVW, a1: C_AREG, a6: C_REG},
|
||
|
{i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG},
|
||
|
{i: 69, as: AMOVW, a1: C_REG, a6: C_AREG},
|
||
|
{i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG},
|
||
|
|
||
|
// macros
|
||
|
{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG},
|
||
|
{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO},
|
||
|
|
||
|
// load/store multiple
|
||
|
{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG},
|
||
|
{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO},
|
||
|
{i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG},
|
||
|
{i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG},
|
||
|
|
||
|
// bytes
|
||
|
{i: 40, as: ABYTE, a1: C_SCON},
|
||
|
{i: 40, as: AWORD, a1: C_LCON},
|
||
|
{i: 31, as: ADWORD, a1: C_LCON},
|
||
|
{i: 31, as: ADWORD, a1: C_DCON},
|
||
|
|
||
|
// fast synchronization
|
||
|
{i: 80, as: ASYNC},
|
||
|
|
||
|
// store clock
|
||
|
{i: 88, as: ASTCK, a6: C_SAUTO},
|
||
|
{i: 88, as: ASTCK, a6: C_SOREG},
|
||
|
|
||
|
// storage and storage
|
||
|
{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG},
|
||
|
{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO},
|
||
|
{i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO},
|
||
|
|
||
|
// address
|
||
|
{i: 85, as: ALARL, a1: C_LCON, a6: C_REG},
|
||
|
{i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG},
|
||
|
{i: 86, as: ALA, a1: C_SOREG, a6: C_REG},
|
||
|
{i: 86, as: ALA, a1: C_SAUTO, a6: C_REG},
|
||
|
{i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG},
|
||
|
|
||
|
// undefined (deliberate illegal instruction)
|
||
|
{i: 78, as: obj.AUNDEF},
|
||
|
|
||
|
// 2 byte no-operation
|
||
|
{i: 66, as: ANOPH},
|
||
|
|
||
|
// vector instructions
|
||
|
|
||
|
// VRX store
|
||
|
{i: 100, as: AVST, a1: C_VREG, a6: C_SOREG},
|
||
|
{i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO},
|
||
|
{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
|
||
|
{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
|
||
|
|
||
|
// VRX load
|
||
|
{i: 101, as: AVL, a1: C_SOREG, a6: C_VREG},
|
||
|
{i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG},
|
||
|
{i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
|
||
|
{i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
|
||
|
|
||
|
// VRV scatter
|
||
|
{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
|
||
|
{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
|
||
|
|
||
|
// VRV gather
|
||
|
{i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
|
||
|
{i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
|
||
|
|
||
|
// VRS element shift/rotate and load gr to/from vr element
|
||
|
{i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG},
|
||
|
{i: 104, as: AVESLG, a1: C_REG, a6: C_VREG},
|
||
|
{i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG},
|
||
|
{i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG},
|
||
|
{i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG},
|
||
|
{i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG},
|
||
|
|
||
|
// VRS store multiple
|
||
|
{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG},
|
||
|
{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO},
|
||
|
|
||
|
// VRS load multiple
|
||
|
{i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRS store with length
|
||
|
{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG},
|
||
|
{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO},
|
||
|
|
||
|
// VRS load with length
|
||
|
{i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG},
|
||
|
{i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG},
|
||
|
|
||
|
// VRI-a
|
||
|
{i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG},
|
||
|
{i: 109, as: AVZERO, a6: C_VREG},
|
||
|
{i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG},
|
||
|
{i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG},
|
||
|
{i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG},
|
||
|
{i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
|
||
|
|
||
|
// VRI-b generate mask
|
||
|
{i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
|
||
|
|
||
|
// VRI-c replicate
|
||
|
{i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRI-d element rotate and insert under mask and
|
||
|
// shift left double by byte
|
||
|
{i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
|
||
|
{i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRI-d fp test data class immediate
|
||
|
{i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-a load reg
|
||
|
{i: 114, as: AVLR, a1: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-a compare
|
||
|
{i: 115, as: AVECG, a1: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-b
|
||
|
{i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-c
|
||
|
{i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG},
|
||
|
{i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG},
|
||
|
{i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-c shifts
|
||
|
{i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
|
||
|
{i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-d
|
||
|
{i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-e
|
||
|
{i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
|
||
|
|
||
|
// VRR-f
|
||
|
{i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG},
|
||
|
}
|
||
|
|
||
|
var oprange [ALAST & obj.AMask][]Optab
|
||
|
|
||
|
var xcmp [C_NCLASS][C_NCLASS]bool
|
||
|
|
||
|
func spanz(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||
|
if ctxt.Retpoline {
|
||
|
ctxt.Diag("-spectre=ret not supported on s390x")
|
||
|
ctxt.Retpoline = false // don't keep printing
|
||
|
}
|
||
|
|
||
|
p := cursym.Func.Text
|
||
|
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if oprange[AORW&obj.AMask] == nil {
|
||
|
ctxt.Diag("s390x ops not initialized, call s390x.buildop first")
|
||
|
}
|
||
|
|
||
|
c := ctxtz{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
|
||
|
|
||
|
buffer := make([]byte, 0)
|
||
|
changed := true
|
||
|
loop := 0
|
||
|
for changed {
|
||
|
if loop > 100 {
|
||
|
c.ctxt.Diag("stuck in spanz loop")
|
||
|
break
|
||
|
}
|
||
|
changed = false
|
||
|
buffer = buffer[:0]
|
||
|
c.cursym.R = make([]obj.Reloc, 0)
|
||
|
for p := c.cursym.Func.Text; p != nil; p = p.Link {
|
||
|
pc := int64(len(buffer))
|
||
|
if pc != p.Pc {
|
||
|
changed = true
|
||
|
}
|
||
|
p.Pc = pc
|
||
|
c.pc = p.Pc
|
||
|
c.asmout(p, &buffer)
|
||
|
if pc == int64(len(buffer)) {
|
||
|
switch p.As {
|
||
|
case obj.ANOP, obj.AFUNCDATA, obj.APCDATA, obj.ATEXT:
|
||
|
// ok
|
||
|
default:
|
||
|
c.ctxt.Diag("zero-width instruction\n%v", p)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
loop++
|
||
|
}
|
||
|
|
||
|
c.cursym.Size = int64(len(buffer))
|
||
|
if c.cursym.Size%funcAlign != 0 {
|
||
|
c.cursym.Size += funcAlign - (c.cursym.Size % funcAlign)
|
||
|
}
|
||
|
c.cursym.Grow(c.cursym.Size)
|
||
|
copy(c.cursym.P, buffer)
|
||
|
|
||
|
// Mark nonpreemptible instruction sequences.
|
||
|
// We use REGTMP as a scratch register during call injection,
|
||
|
// so instruction sequences that use REGTMP are unsafe to
|
||
|
// preempt asynchronously.
|
||
|
obj.MarkUnsafePoints(c.ctxt, c.cursym.Func.Text, c.newprog, c.isUnsafePoint, nil)
|
||
|
}
|
||
|
|
||
|
// Return whether p is an unsafe point.
|
||
|
func (c *ctxtz) isUnsafePoint(p *obj.Prog) bool {
|
||
|
if p.From.Reg == REGTMP || p.To.Reg == REGTMP || p.Reg == REGTMP {
|
||
|
return true
|
||
|
}
|
||
|
for _, a := range p.RestArgs {
|
||
|
if a.Reg == REGTMP {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return p.Mark&USETMP != 0
|
||
|
}
|
||
|
|
||
|
func isint32(v int64) bool {
|
||
|
return int64(int32(v)) == v
|
||
|
}
|
||
|
|
||
|
func isuint32(v uint64) bool {
|
||
|
return uint64(uint32(v)) == v
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) aclass(a *obj.Addr) int {
|
||
|
switch a.Type {
|
||
|
case obj.TYPE_NONE:
|
||
|
return C_NONE
|
||
|
|
||
|
case obj.TYPE_REG:
|
||
|
if REG_R0 <= a.Reg && a.Reg <= REG_R15 {
|
||
|
return C_REG
|
||
|
}
|
||
|
if REG_F0 <= a.Reg && a.Reg <= REG_F15 {
|
||
|
return C_FREG
|
||
|
}
|
||
|
if REG_AR0 <= a.Reg && a.Reg <= REG_AR15 {
|
||
|
return C_AREG
|
||
|
}
|
||
|
if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
|
||
|
return C_VREG
|
||
|
}
|
||
|
return C_GOK
|
||
|
|
||
|
case obj.TYPE_MEM:
|
||
|
switch a.Name {
|
||
|
case obj.NAME_EXTERN,
|
||
|
obj.NAME_STATIC:
|
||
|
if a.Sym == nil {
|
||
|
// must have a symbol
|
||
|
break
|
||
|
}
|
||
|
c.instoffset = a.Offset
|
||
|
if a.Sym.Type == objabi.STLSBSS {
|
||
|
if c.ctxt.Flag_shared {
|
||
|
return C_TLS_IE // initial exec model
|
||
|
}
|
||
|
return C_TLS_LE // local exec model
|
||
|
}
|
||
|
return C_ADDR
|
||
|
|
||
|
case obj.NAME_GOTREF:
|
||
|
return C_GOTADDR
|
||
|
|
||
|
case obj.NAME_AUTO:
|
||
|
if a.Reg == REGSP {
|
||
|
// unset base register for better printing, since
|
||
|
// a.Offset is still relative to pseudo-SP.
|
||
|
a.Reg = obj.REG_NONE
|
||
|
}
|
||
|
c.instoffset = int64(c.autosize) + a.Offset
|
||
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||
|
return C_SAUTO
|
||
|
}
|
||
|
return C_LAUTO
|
||
|
|
||
|
case obj.NAME_PARAM:
|
||
|
if a.Reg == REGSP {
|
||
|
// unset base register for better printing, since
|
||
|
// a.Offset is still relative to pseudo-FP.
|
||
|
a.Reg = obj.REG_NONE
|
||
|
}
|
||
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||
|
return C_SAUTO
|
||
|
}
|
||
|
return C_LAUTO
|
||
|
|
||
|
case obj.NAME_NONE:
|
||
|
c.instoffset = a.Offset
|
||
|
if c.instoffset == 0 {
|
||
|
return C_ZOREG
|
||
|
}
|
||
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||
|
return C_SOREG
|
||
|
}
|
||
|
return C_LOREG
|
||
|
}
|
||
|
|
||
|
return C_GOK
|
||
|
|
||
|
case obj.TYPE_TEXTSIZE:
|
||
|
return C_TEXTSIZE
|
||
|
|
||
|
case obj.TYPE_FCONST:
|
||
|
if f64, ok := a.Val.(float64); ok && math.Float64bits(f64) == 0 {
|
||
|
return C_ZCON
|
||
|
}
|
||
|
c.ctxt.Diag("cannot handle the floating point constant %v", a.Val)
|
||
|
|
||
|
case obj.TYPE_CONST,
|
||
|
obj.TYPE_ADDR:
|
||
|
switch a.Name {
|
||
|
case obj.NAME_NONE:
|
||
|
c.instoffset = a.Offset
|
||
|
if a.Reg != 0 {
|
||
|
if -BIG <= c.instoffset && c.instoffset <= BIG {
|
||
|
return C_SACON
|
||
|
}
|
||
|
if isint32(c.instoffset) {
|
||
|
return C_LACON
|
||
|
}
|
||
|
return C_DACON
|
||
|
}
|
||
|
|
||
|
case obj.NAME_EXTERN,
|
||
|
obj.NAME_STATIC:
|
||
|
s := a.Sym
|
||
|
if s == nil {
|
||
|
return C_GOK
|
||
|
}
|
||
|
c.instoffset = a.Offset
|
||
|
|
||
|
return C_SYMADDR
|
||
|
|
||
|
case obj.NAME_AUTO:
|
||
|
if a.Reg == REGSP {
|
||
|
// unset base register for better printing, since
|
||
|
// a.Offset is still relative to pseudo-SP.
|
||
|
a.Reg = obj.REG_NONE
|
||
|
}
|
||
|
c.instoffset = int64(c.autosize) + a.Offset
|
||
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||
|
return C_SACON
|
||
|
}
|
||
|
return C_LACON
|
||
|
|
||
|
case obj.NAME_PARAM:
|
||
|
if a.Reg == REGSP {
|
||
|
// unset base register for better printing, since
|
||
|
// a.Offset is still relative to pseudo-FP.
|
||
|
a.Reg = obj.REG_NONE
|
||
|
}
|
||
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||
|
return C_SACON
|
||
|
}
|
||
|
return C_LACON
|
||
|
|
||
|
default:
|
||
|
return C_GOK
|
||
|
}
|
||
|
|
||
|
if c.instoffset == 0 {
|
||
|
return C_ZCON
|
||
|
}
|
||
|
if c.instoffset >= 0 {
|
||
|
if c.instoffset <= 0x7fff {
|
||
|
return C_SCON
|
||
|
}
|
||
|
if c.instoffset <= 0xffff {
|
||
|
return C_ANDCON
|
||
|
}
|
||
|
if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
|
||
|
return C_UCON
|
||
|
}
|
||
|
if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
|
||
|
return C_LCON
|
||
|
}
|
||
|
return C_DCON
|
||
|
}
|
||
|
|
||
|
if c.instoffset >= -0x8000 {
|
||
|
return C_ADDCON
|
||
|
}
|
||
|
if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
|
||
|
return C_UCON
|
||
|
}
|
||
|
if isint32(c.instoffset) {
|
||
|
return C_LCON
|
||
|
}
|
||
|
return C_DCON
|
||
|
|
||
|
case obj.TYPE_BRANCH:
|
||
|
return C_SBRA
|
||
|
}
|
||
|
|
||
|
return C_GOK
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) oplook(p *obj.Prog) *Optab {
|
||
|
// Return cached optab entry if available.
|
||
|
if p.Optab != 0 {
|
||
|
return &optab[p.Optab-1]
|
||
|
}
|
||
|
if len(p.RestArgs) > 3 {
|
||
|
c.ctxt.Diag("too many RestArgs: got %v, maximum is 3\n", len(p.RestArgs))
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Initialize classes for all arguments.
|
||
|
p.From.Class = int8(c.aclass(&p.From) + 1)
|
||
|
p.To.Class = int8(c.aclass(&p.To) + 1)
|
||
|
for i := range p.RestArgs {
|
||
|
p.RestArgs[i].Class = int8(c.aclass(&p.RestArgs[i]) + 1)
|
||
|
}
|
||
|
|
||
|
// Mirrors the argument list in Optab.
|
||
|
args := [...]int8{
|
||
|
p.From.Class - 1,
|
||
|
C_NONE, // p.Reg
|
||
|
C_NONE, // p.RestArgs[0]
|
||
|
C_NONE, // p.RestArgs[1]
|
||
|
C_NONE, // p.RestArgs[2]
|
||
|
p.To.Class - 1,
|
||
|
}
|
||
|
// Fill in argument class for p.Reg.
|
||
|
switch {
|
||
|
case REG_R0 <= p.Reg && p.Reg <= REG_R15:
|
||
|
args[1] = C_REG
|
||
|
case REG_V0 <= p.Reg && p.Reg <= REG_V31:
|
||
|
args[1] = C_VREG
|
||
|
case REG_F0 <= p.Reg && p.Reg <= REG_F15:
|
||
|
args[1] = C_FREG
|
||
|
case REG_AR0 <= p.Reg && p.Reg <= REG_AR15:
|
||
|
args[1] = C_AREG
|
||
|
}
|
||
|
// Fill in argument classes for p.RestArgs.
|
||
|
for i, a := range p.RestArgs {
|
||
|
args[2+i] = a.Class - 1
|
||
|
}
|
||
|
|
||
|
// Lookup op in optab.
|
||
|
ops := oprange[p.As&obj.AMask]
|
||
|
cmp := [len(args)]*[C_NCLASS]bool{}
|
||
|
for i := range cmp {
|
||
|
cmp[i] = &xcmp[args[i]]
|
||
|
}
|
||
|
for i := range ops {
|
||
|
op := &ops[i]
|
||
|
if cmp[0][op.a1] && cmp[1][op.a2] &&
|
||
|
cmp[2][op.a3] && cmp[3][op.a4] &&
|
||
|
cmp[4][op.a5] && cmp[5][op.a6] {
|
||
|
p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
|
||
|
return op
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Cannot find a case; abort.
|
||
|
s := ""
|
||
|
for _, a := range args {
|
||
|
s += fmt.Sprintf(" %v", DRconv(int(a)))
|
||
|
}
|
||
|
c.ctxt.Diag("illegal combination %v%v\n", p.As, s)
|
||
|
c.ctxt.Diag("prog: %v\n", p)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func cmp(a int, b int) bool {
|
||
|
if a == b {
|
||
|
return true
|
||
|
}
|
||
|
switch a {
|
||
|
case C_DCON:
|
||
|
if b == C_LCON {
|
||
|
return true
|
||
|
}
|
||
|
fallthrough
|
||
|
case C_LCON:
|
||
|
if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_ADDCON:
|
||
|
if b == C_ZCON || b == C_SCON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_ANDCON:
|
||
|
if b == C_ZCON || b == C_SCON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_UCON:
|
||
|
if b == C_ZCON || b == C_SCON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_SCON:
|
||
|
if b == C_ZCON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_LACON:
|
||
|
if b == C_SACON {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_LBRA:
|
||
|
if b == C_SBRA {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_LAUTO:
|
||
|
if b == C_SAUTO {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_LOREG:
|
||
|
if b == C_ZOREG || b == C_SOREG {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_SOREG:
|
||
|
if b == C_ZOREG {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
case C_ANY:
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
type ocmp []Optab
|
||
|
|
||
|
func (x ocmp) Len() int {
|
||
|
return len(x)
|
||
|
}
|
||
|
|
||
|
func (x ocmp) Swap(i, j int) {
|
||
|
x[i], x[j] = x[j], x[i]
|
||
|
}
|
||
|
|
||
|
func (x ocmp) Less(i, j int) bool {
|
||
|
p1 := &x[i]
|
||
|
p2 := &x[j]
|
||
|
n := int(p1.as) - int(p2.as)
|
||
|
if n != 0 {
|
||
|
return n < 0
|
||
|
}
|
||
|
n = int(p1.a1) - int(p2.a1)
|
||
|
if n != 0 {
|
||
|
return n < 0
|
||
|
}
|
||
|
n = int(p1.a2) - int(p2.a2)
|
||
|
if n != 0 {
|
||
|
return n < 0
|
||
|
}
|
||
|
n = int(p1.a3) - int(p2.a3)
|
||
|
if n != 0 {
|
||
|
return n < 0
|
||
|
}
|
||
|
n = int(p1.a4) - int(p2.a4)
|
||
|
if n != 0 {
|
||
|
return n < 0
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
func opset(a, b obj.As) {
|
||
|
oprange[a&obj.AMask] = oprange[b&obj.AMask]
|
||
|
}
|
||
|
|
||
|
func buildop(ctxt *obj.Link) {
|
||
|
if oprange[AORW&obj.AMask] != nil {
|
||
|
// Already initialized; stop now.
|
||
|
// This happens in the cmd/asm tests,
|
||
|
// each of which re-initializes the arch.
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for i := 0; i < C_NCLASS; i++ {
|
||
|
for n := 0; n < C_NCLASS; n++ {
|
||
|
if cmp(n, i) {
|
||
|
xcmp[i][n] = true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
sort.Sort(ocmp(optab))
|
||
|
for i := 0; i < len(optab); i++ {
|
||
|
r := optab[i].as
|
||
|
start := i
|
||
|
for ; i+1 < len(optab); i++ {
|
||
|
if optab[i+1].as != r {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
oprange[r&obj.AMask] = optab[start : i+1]
|
||
|
|
||
|
// opset() aliases optab ranges for similar instructions, to reduce the number of optabs in the array.
|
||
|
// oprange[] is used by oplook() to find the Optab entry that applies to a given Prog.
|
||
|
switch r {
|
||
|
case AADD:
|
||
|
opset(AADDC, r)
|
||
|
opset(AADDW, r)
|
||
|
opset(AADDE, r)
|
||
|
opset(AMULLD, r)
|
||
|
opset(AMULLW, r)
|
||
|
case ADIVW:
|
||
|
opset(ADIVD, r)
|
||
|
opset(ADIVDU, r)
|
||
|
opset(ADIVWU, r)
|
||
|
opset(AMODD, r)
|
||
|
opset(AMODDU, r)
|
||
|
opset(AMODW, r)
|
||
|
opset(AMODWU, r)
|
||
|
case AMULHD:
|
||
|
opset(AMULHDU, r)
|
||
|
case AMOVBZ:
|
||
|
opset(AMOVH, r)
|
||
|
opset(AMOVHZ, r)
|
||
|
case ALA:
|
||
|
opset(ALAY, r)
|
||
|
case AMVC:
|
||
|
opset(AMVCIN, r)
|
||
|
opset(ACLC, r)
|
||
|
opset(AXC, r)
|
||
|
opset(AOC, r)
|
||
|
opset(ANC, r)
|
||
|
case ASTCK:
|
||
|
opset(ASTCKC, r)
|
||
|
opset(ASTCKE, r)
|
||
|
opset(ASTCKF, r)
|
||
|
case ALAAG:
|
||
|
opset(ALAA, r)
|
||
|
opset(ALAAL, r)
|
||
|
opset(ALAALG, r)
|
||
|
opset(ALAN, r)
|
||
|
opset(ALANG, r)
|
||
|
opset(ALAX, r)
|
||
|
opset(ALAXG, r)
|
||
|
opset(ALAO, r)
|
||
|
opset(ALAOG, r)
|
||
|
case ASTMG:
|
||
|
opset(ASTMY, r)
|
||
|
case ALMG:
|
||
|
opset(ALMY, r)
|
||
|
case ABEQ:
|
||
|
opset(ABGE, r)
|
||
|
opset(ABGT, r)
|
||
|
opset(ABLE, r)
|
||
|
opset(ABLT, r)
|
||
|
opset(ABNE, r)
|
||
|
opset(ABVC, r)
|
||
|
opset(ABVS, r)
|
||
|
opset(ABLEU, r)
|
||
|
opset(ABLTU, r)
|
||
|
case ABR:
|
||
|
opset(ABL, r)
|
||
|
case ABC:
|
||
|
opset(ABCL, r)
|
||
|
case AFABS:
|
||
|
opset(AFNABS, r)
|
||
|
opset(ALPDFR, r)
|
||
|
opset(ALNDFR, r)
|
||
|
opset(AFNEG, r)
|
||
|
opset(AFNEGS, r)
|
||
|
opset(ALEDBR, r)
|
||
|
opset(ALDEBR, r)
|
||
|
opset(AFSQRT, r)
|
||
|
opset(AFSQRTS, r)
|
||
|
case AFADD:
|
||
|
opset(AFADDS, r)
|
||
|
opset(AFDIV, r)
|
||
|
opset(AFDIVS, r)
|
||
|
opset(AFSUB, r)
|
||
|
opset(AFSUBS, r)
|
||
|
case AFMADD:
|
||
|
opset(AFMADDS, r)
|
||
|
opset(AFMSUB, r)
|
||
|
opset(AFMSUBS, r)
|
||
|
case AFMUL:
|
||
|
opset(AFMULS, r)
|
||
|
case AFCMPO:
|
||
|
opset(AFCMPU, r)
|
||
|
opset(ACEBR, r)
|
||
|
case AAND:
|
||
|
opset(AOR, r)
|
||
|
opset(AXOR, r)
|
||
|
case AANDW:
|
||
|
opset(AORW, r)
|
||
|
opset(AXORW, r)
|
||
|
case ASLD:
|
||
|
opset(ASRD, r)
|
||
|
opset(ASLW, r)
|
||
|
opset(ASRW, r)
|
||
|
opset(ASRAD, r)
|
||
|
opset(ASRAW, r)
|
||
|
opset(ARLL, r)
|
||
|
opset(ARLLG, r)
|
||
|
case ARNSBG:
|
||
|
opset(ARXSBG, r)
|
||
|
opset(AROSBG, r)
|
||
|
opset(ARNSBGT, r)
|
||
|
opset(ARXSBGT, r)
|
||
|
opset(AROSBGT, r)
|
||
|
opset(ARISBG, r)
|
||
|
opset(ARISBGN, r)
|
||
|
opset(ARISBGZ, r)
|
||
|
opset(ARISBGNZ, r)
|
||
|
opset(ARISBHG, r)
|
||
|
opset(ARISBLG, r)
|
||
|
opset(ARISBHGZ, r)
|
||
|
opset(ARISBLGZ, r)
|
||
|
case ACSG:
|
||
|
opset(ACS, r)
|
||
|
case ASUB:
|
||
|
opset(ASUBC, r)
|
||
|
opset(ASUBE, r)
|
||
|
opset(ASUBW, r)
|
||
|
case ANEG:
|
||
|
opset(ANEGW, r)
|
||
|
case AFMOVD:
|
||
|
opset(AFMOVS, r)
|
||
|
case AMOVDBR:
|
||
|
opset(AMOVWBR, r)
|
||
|
case ACMP:
|
||
|
opset(ACMPW, r)
|
||
|
case ACMPU:
|
||
|
opset(ACMPWU, r)
|
||
|
case ATMHH:
|
||
|
opset(ATMHL, r)
|
||
|
opset(ATMLH, r)
|
||
|
opset(ATMLL, r)
|
||
|
case ACEFBRA:
|
||
|
opset(ACDFBRA, r)
|
||
|
opset(ACEGBRA, r)
|
||
|
opset(ACDGBRA, r)
|
||
|
opset(ACELFBR, r)
|
||
|
opset(ACDLFBR, r)
|
||
|
opset(ACELGBR, r)
|
||
|
opset(ACDLGBR, r)
|
||
|
case ACFEBRA:
|
||
|
opset(ACFDBRA, r)
|
||
|
opset(ACGEBRA, r)
|
||
|
opset(ACGDBRA, r)
|
||
|
opset(ACLFEBR, r)
|
||
|
opset(ACLFDBR, r)
|
||
|
opset(ACLGEBR, r)
|
||
|
opset(ACLGDBR, r)
|
||
|
case AFIEBR:
|
||
|
opset(AFIDBR, r)
|
||
|
case ACMPBEQ:
|
||
|
opset(ACMPBGE, r)
|
||
|
opset(ACMPBGT, r)
|
||
|
opset(ACMPBLE, r)
|
||
|
opset(ACMPBLT, r)
|
||
|
opset(ACMPBNE, r)
|
||
|
case ACMPUBEQ:
|
||
|
opset(ACMPUBGE, r)
|
||
|
opset(ACMPUBGT, r)
|
||
|
opset(ACMPUBLE, r)
|
||
|
opset(ACMPUBLT, r)
|
||
|
opset(ACMPUBNE, r)
|
||
|
case ACGRJ:
|
||
|
opset(ACRJ, r)
|
||
|
case ACLGRJ:
|
||
|
opset(ACLRJ, r)
|
||
|
case ACGIJ:
|
||
|
opset(ACIJ, r)
|
||
|
case ACLGIJ:
|
||
|
opset(ACLIJ, r)
|
||
|
case AMOVDEQ:
|
||
|
opset(AMOVDGE, r)
|
||
|
opset(AMOVDGT, r)
|
||
|
opset(AMOVDLE, r)
|
||
|
opset(AMOVDLT, r)
|
||
|
opset(AMOVDNE, r)
|
||
|
case ALOCGR:
|
||
|
opset(ALOCR, r)
|
||
|
case ALTDBR:
|
||
|
opset(ALTEBR, r)
|
||
|
case ATCDB:
|
||
|
opset(ATCEB, r)
|
||
|
case AVL:
|
||
|
opset(AVLLEZB, r)
|
||
|
opset(AVLLEZH, r)
|
||
|
opset(AVLLEZF, r)
|
||
|
opset(AVLLEZG, r)
|
||
|
opset(AVLREPB, r)
|
||
|
opset(AVLREPH, r)
|
||
|
opset(AVLREPF, r)
|
||
|
opset(AVLREPG, r)
|
||
|
case AVLEG:
|
||
|
opset(AVLBB, r)
|
||
|
opset(AVLEB, r)
|
||
|
opset(AVLEH, r)
|
||
|
opset(AVLEF, r)
|
||
|
opset(AVLEG, r)
|
||
|
opset(AVLREP, r)
|
||
|
case AVSTEG:
|
||
|
opset(AVSTEB, r)
|
||
|
opset(AVSTEH, r)
|
||
|
opset(AVSTEF, r)
|
||
|
case AVSCEG:
|
||
|
opset(AVSCEF, r)
|
||
|
case AVGEG:
|
||
|
opset(AVGEF, r)
|
||
|
case AVESLG:
|
||
|
opset(AVESLB, r)
|
||
|
opset(AVESLH, r)
|
||
|
opset(AVESLF, r)
|
||
|
opset(AVERLLB, r)
|
||
|
opset(AVERLLH, r)
|
||
|
opset(AVERLLF, r)
|
||
|
opset(AVERLLG, r)
|
||
|
opset(AVESRAB, r)
|
||
|
opset(AVESRAH, r)
|
||
|
opset(AVESRAF, r)
|
||
|
opset(AVESRAG, r)
|
||
|
opset(AVESRLB, r)
|
||
|
opset(AVESRLH, r)
|
||
|
opset(AVESRLF, r)
|
||
|
opset(AVESRLG, r)
|
||
|
case AVLGVG:
|
||
|
opset(AVLGVB, r)
|
||
|
opset(AVLGVH, r)
|
||
|
opset(AVLGVF, r)
|
||
|
case AVLVGG:
|
||
|
opset(AVLVGB, r)
|
||
|
opset(AVLVGH, r)
|
||
|
opset(AVLVGF, r)
|
||
|
case AVZERO:
|
||
|
opset(AVONE, r)
|
||
|
case AVREPIG:
|
||
|
opset(AVREPIB, r)
|
||
|
opset(AVREPIH, r)
|
||
|
opset(AVREPIF, r)
|
||
|
case AVLEIG:
|
||
|
opset(AVLEIB, r)
|
||
|
opset(AVLEIH, r)
|
||
|
opset(AVLEIF, r)
|
||
|
case AVGMG:
|
||
|
opset(AVGMB, r)
|
||
|
opset(AVGMH, r)
|
||
|
opset(AVGMF, r)
|
||
|
case AVREPG:
|
||
|
opset(AVREPB, r)
|
||
|
opset(AVREPH, r)
|
||
|
opset(AVREPF, r)
|
||
|
case AVERIMG:
|
||
|
opset(AVERIMB, r)
|
||
|
opset(AVERIMH, r)
|
||
|
opset(AVERIMF, r)
|
||
|
case AVFTCIDB:
|
||
|
opset(AWFTCIDB, r)
|
||
|
case AVLR:
|
||
|
opset(AVUPHB, r)
|
||
|
opset(AVUPHH, r)
|
||
|
opset(AVUPHF, r)
|
||
|
opset(AVUPLHB, r)
|
||
|
opset(AVUPLHH, r)
|
||
|
opset(AVUPLHF, r)
|
||
|
opset(AVUPLB, r)
|
||
|
opset(AVUPLHW, r)
|
||
|
opset(AVUPLF, r)
|
||
|
opset(AVUPLLB, r)
|
||
|
opset(AVUPLLH, r)
|
||
|
opset(AVUPLLF, r)
|
||
|
opset(AVCLZB, r)
|
||
|
opset(AVCLZH, r)
|
||
|
opset(AVCLZF, r)
|
||
|
opset(AVCLZG, r)
|
||
|
opset(AVCTZB, r)
|
||
|
opset(AVCTZH, r)
|
||
|
opset(AVCTZF, r)
|
||
|
opset(AVCTZG, r)
|
||
|
opset(AVLDEB, r)
|
||
|
opset(AWLDEB, r)
|
||
|
opset(AVFLCDB, r)
|
||
|
opset(AWFLCDB, r)
|
||
|
opset(AVFLNDB, r)
|
||
|
opset(AWFLNDB, r)
|
||
|
opset(AVFLPDB, r)
|
||
|
opset(AWFLPDB, r)
|
||
|
opset(AVFSQDB, r)
|
||
|
opset(AWFSQDB, r)
|
||
|
opset(AVISTRB, r)
|
||
|
opset(AVISTRH, r)
|
||
|
opset(AVISTRF, r)
|
||
|
opset(AVISTRBS, r)
|
||
|
opset(AVISTRHS, r)
|
||
|
opset(AVISTRFS, r)
|
||
|
opset(AVLCB, r)
|
||
|
opset(AVLCH, r)
|
||
|
opset(AVLCF, r)
|
||
|
opset(AVLCG, r)
|
||
|
opset(AVLPB, r)
|
||
|
opset(AVLPH, r)
|
||
|
opset(AVLPF, r)
|
||
|
opset(AVLPG, r)
|
||
|
opset(AVPOPCT, r)
|
||
|
opset(AVSEGB, r)
|
||
|
opset(AVSEGH, r)
|
||
|
opset(AVSEGF, r)
|
||
|
case AVECG:
|
||
|
opset(AVECB, r)
|
||
|
opset(AVECH, r)
|
||
|
opset(AVECF, r)
|
||
|
opset(AVECLB, r)
|
||
|
opset(AVECLH, r)
|
||
|
opset(AVECLF, r)
|
||
|
opset(AVECLG, r)
|
||
|
opset(AWFCDB, r)
|
||
|
opset(AWFKDB, r)
|
||
|
case AVCEQG:
|
||
|
opset(AVCEQB, r)
|
||
|
opset(AVCEQH, r)
|
||
|
opset(AVCEQF, r)
|
||
|
opset(AVCEQBS, r)
|
||
|
opset(AVCEQHS, r)
|
||
|
opset(AVCEQFS, r)
|
||
|
opset(AVCEQGS, r)
|
||
|
opset(AVCHB, r)
|
||
|
opset(AVCHH, r)
|
||
|
opset(AVCHF, r)
|
||
|
opset(AVCHG, r)
|
||
|
opset(AVCHBS, r)
|
||
|
opset(AVCHHS, r)
|
||
|
opset(AVCHFS, r)
|
||
|
opset(AVCHGS, r)
|
||
|
opset(AVCHLB, r)
|
||
|
opset(AVCHLH, r)
|
||
|
opset(AVCHLF, r)
|
||
|
opset(AVCHLG, r)
|
||
|
opset(AVCHLBS, r)
|
||
|
opset(AVCHLHS, r)
|
||
|
opset(AVCHLFS, r)
|
||
|
opset(AVCHLGS, r)
|
||
|
case AVFAEF:
|
||
|
opset(AVFAEB, r)
|
||
|
opset(AVFAEH, r)
|
||
|
opset(AVFAEBS, r)
|
||
|
opset(AVFAEHS, r)
|
||
|
opset(AVFAEFS, r)
|
||
|
opset(AVFAEZB, r)
|
||
|
opset(AVFAEZH, r)
|
||
|
opset(AVFAEZF, r)
|
||
|
opset(AVFAEZBS, r)
|
||
|
opset(AVFAEZHS, r)
|
||
|
opset(AVFAEZFS, r)
|
||
|
opset(AVFEEB, r)
|
||
|
opset(AVFEEH, r)
|
||
|
opset(AVFEEF, r)
|
||
|
opset(AVFEEBS, r)
|
||
|
opset(AVFEEHS, r)
|
||
|
opset(AVFEEFS, r)
|
||
|
opset(AVFEEZB, r)
|
||
|
opset(AVFEEZH, r)
|
||
|
opset(AVFEEZF, r)
|
||
|
opset(AVFEEZBS, r)
|
||
|
opset(AVFEEZHS, r)
|
||
|
opset(AVFEEZFS, r)
|
||
|
opset(AVFENEB, r)
|
||
|
opset(AVFENEH, r)
|
||
|
opset(AVFENEF, r)
|
||
|
opset(AVFENEBS, r)
|
||
|
opset(AVFENEHS, r)
|
||
|
opset(AVFENEFS, r)
|
||
|
opset(AVFENEZB, r)
|
||
|
opset(AVFENEZH, r)
|
||
|
opset(AVFENEZF, r)
|
||
|
opset(AVFENEZBS, r)
|
||
|
opset(AVFENEZHS, r)
|
||
|
opset(AVFENEZFS, r)
|
||
|
case AVPKSG:
|
||
|
opset(AVPKSH, r)
|
||
|
opset(AVPKSF, r)
|
||
|
opset(AVPKSHS, r)
|
||
|
opset(AVPKSFS, r)
|
||
|
opset(AVPKSGS, r)
|
||
|
opset(AVPKLSH, r)
|
||
|
opset(AVPKLSF, r)
|
||
|
opset(AVPKLSG, r)
|
||
|
opset(AVPKLSHS, r)
|
||
|
opset(AVPKLSFS, r)
|
||
|
opset(AVPKLSGS, r)
|
||
|
case AVAQ:
|
||
|
opset(AVAB, r)
|
||
|
opset(AVAH, r)
|
||
|
opset(AVAF, r)
|
||
|
opset(AVAG, r)
|
||
|
opset(AVACCB, r)
|
||
|
opset(AVACCH, r)
|
||
|
opset(AVACCF, r)
|
||
|
opset(AVACCG, r)
|
||
|
opset(AVACCQ, r)
|
||
|
opset(AVN, r)
|
||
|
opset(AVNC, r)
|
||
|
opset(AVAVGB, r)
|
||
|
opset(AVAVGH, r)
|
||
|
opset(AVAVGF, r)
|
||
|
opset(AVAVGG, r)
|
||
|
opset(AVAVGLB, r)
|
||
|
opset(AVAVGLH, r)
|
||
|
opset(AVAVGLF, r)
|
||
|
opset(AVAVGLG, r)
|
||
|
opset(AVCKSM, r)
|
||
|
opset(AVX, r)
|
||
|
opset(AVFADB, r)
|
||
|
opset(AWFADB, r)
|
||
|
opset(AVFCEDB, r)
|
||
|
opset(AVFCEDBS, r)
|
||
|
opset(AWFCEDB, r)
|
||
|
opset(AWFCEDBS, r)
|
||
|
opset(AVFCHDB, r)
|
||
|
opset(AVFCHDBS, r)
|
||
|
opset(AWFCHDB, r)
|
||
|
opset(AWFCHDBS, r)
|
||
|
opset(AVFCHEDB, r)
|
||
|
opset(AVFCHEDBS, r)
|
||
|
opset(AWFCHEDB, r)
|
||
|
opset(AWFCHEDBS, r)
|
||
|
opset(AVFMDB, r)
|
||
|
opset(AWFMDB, r)
|
||
|
opset(AVGFMB, r)
|
||
|
opset(AVGFMH, r)
|
||
|
opset(AVGFMF, r)
|
||
|
opset(AVGFMG, r)
|
||
|
opset(AVMXB, r)
|
||
|
opset(AVMXH, r)
|
||
|
opset(AVMXF, r)
|
||
|
opset(AVMXG, r)
|
||
|
opset(AVMXLB, r)
|
||
|
opset(AVMXLH, r)
|
||
|
opset(AVMXLF, r)
|
||
|
opset(AVMXLG, r)
|
||
|
opset(AVMNB, r)
|
||
|
opset(AVMNH, r)
|
||
|
opset(AVMNF, r)
|
||
|
opset(AVMNG, r)
|
||
|
opset(AVMNLB, r)
|
||
|
opset(AVMNLH, r)
|
||
|
opset(AVMNLF, r)
|
||
|
opset(AVMNLG, r)
|
||
|
opset(AVMRHB, r)
|
||
|
opset(AVMRHH, r)
|
||
|
opset(AVMRHF, r)
|
||
|
opset(AVMRHG, r)
|
||
|
opset(AVMRLB, r)
|
||
|
opset(AVMRLH, r)
|
||
|
opset(AVMRLF, r)
|
||
|
opset(AVMRLG, r)
|
||
|
opset(AVMEB, r)
|
||
|
opset(AVMEH, r)
|
||
|
opset(AVMEF, r)
|
||
|
opset(AVMLEB, r)
|
||
|
opset(AVMLEH, r)
|
||
|
opset(AVMLEF, r)
|
||
|
opset(AVMOB, r)
|
||
|
opset(AVMOH, r)
|
||
|
opset(AVMOF, r)
|
||
|
opset(AVMLOB, r)
|
||
|
opset(AVMLOH, r)
|
||
|
opset(AVMLOF, r)
|
||
|
opset(AVMHB, r)
|
||
|
opset(AVMHH, r)
|
||
|
opset(AVMHF, r)
|
||
|
opset(AVMLHB, r)
|
||
|
opset(AVMLHH, r)
|
||
|
opset(AVMLHF, r)
|
||
|
opset(AVMLH, r)
|
||
|
opset(AVMLHW, r)
|
||
|
opset(AVMLF, r)
|
||
|
opset(AVNO, r)
|
||
|
opset(AVO, r)
|
||
|
opset(AVPKH, r)
|
||
|
opset(AVPKF, r)
|
||
|
opset(AVPKG, r)
|
||
|
opset(AVSUMGH, r)
|
||
|
opset(AVSUMGF, r)
|
||
|
opset(AVSUMQF, r)
|
||
|
opset(AVSUMQG, r)
|
||
|
opset(AVSUMB, r)
|
||
|
opset(AVSUMH, r)
|
||
|
case AVERLLVG:
|
||
|
opset(AVERLLVB, r)
|
||
|
opset(AVERLLVH, r)
|
||
|
opset(AVERLLVF, r)
|
||
|
opset(AVESLVB, r)
|
||
|
opset(AVESLVH, r)
|
||
|
opset(AVESLVF, r)
|
||
|
opset(AVESLVG, r)
|
||
|
opset(AVESRAVB, r)
|
||
|
opset(AVESRAVH, r)
|
||
|
opset(AVESRAVF, r)
|
||
|
opset(AVESRAVG, r)
|
||
|
opset(AVESRLVB, r)
|
||
|
opset(AVESRLVH, r)
|
||
|
opset(AVESRLVF, r)
|
||
|
opset(AVESRLVG, r)
|
||
|
opset(AVFDDB, r)
|
||
|
opset(AWFDDB, r)
|
||
|
opset(AVFSDB, r)
|
||
|
opset(AWFSDB, r)
|
||
|
opset(AVSL, r)
|
||
|
opset(AVSLB, r)
|
||
|
opset(AVSRA, r)
|
||
|
opset(AVSRAB, r)
|
||
|
opset(AVSRL, r)
|
||
|
opset(AVSRLB, r)
|
||
|
opset(AVSB, r)
|
||
|
opset(AVSH, r)
|
||
|
opset(AVSF, r)
|
||
|
opset(AVSG, r)
|
||
|
opset(AVSQ, r)
|
||
|
opset(AVSCBIB, r)
|
||
|
opset(AVSCBIH, r)
|
||
|
opset(AVSCBIF, r)
|
||
|
opset(AVSCBIG, r)
|
||
|
opset(AVSCBIQ, r)
|
||
|
case AVACQ:
|
||
|
opset(AVACCCQ, r)
|
||
|
opset(AVGFMAB, r)
|
||
|
opset(AVGFMAH, r)
|
||
|
opset(AVGFMAF, r)
|
||
|
opset(AVGFMAG, r)
|
||
|
opset(AVMALB, r)
|
||
|
opset(AVMALHW, r)
|
||
|
opset(AVMALF, r)
|
||
|
opset(AVMAHB, r)
|
||
|
opset(AVMAHH, r)
|
||
|
opset(AVMAHF, r)
|
||
|
opset(AVMALHB, r)
|
||
|
opset(AVMALHH, r)
|
||
|
opset(AVMALHF, r)
|
||
|
opset(AVMAEB, r)
|
||
|
opset(AVMAEH, r)
|
||
|
opset(AVMAEF, r)
|
||
|
opset(AVMALEB, r)
|
||
|
opset(AVMALEH, r)
|
||
|
opset(AVMALEF, r)
|
||
|
opset(AVMAOB, r)
|
||
|
opset(AVMAOH, r)
|
||
|
opset(AVMAOF, r)
|
||
|
opset(AVMALOB, r)
|
||
|
opset(AVMALOH, r)
|
||
|
opset(AVMALOF, r)
|
||
|
opset(AVSTRCB, r)
|
||
|
opset(AVSTRCH, r)
|
||
|
opset(AVSTRCF, r)
|
||
|
opset(AVSTRCBS, r)
|
||
|
opset(AVSTRCHS, r)
|
||
|
opset(AVSTRCFS, r)
|
||
|
opset(AVSTRCZB, r)
|
||
|
opset(AVSTRCZH, r)
|
||
|
opset(AVSTRCZF, r)
|
||
|
opset(AVSTRCZBS, r)
|
||
|
opset(AVSTRCZHS, r)
|
||
|
opset(AVSTRCZFS, r)
|
||
|
opset(AVSBCBIQ, r)
|
||
|
opset(AVSBIQ, r)
|
||
|
opset(AVMSLG, r)
|
||
|
opset(AVMSLEG, r)
|
||
|
opset(AVMSLOG, r)
|
||
|
opset(AVMSLEOG, r)
|
||
|
case AVSEL:
|
||
|
opset(AVFMADB, r)
|
||
|
opset(AWFMADB, r)
|
||
|
opset(AVFMSDB, r)
|
||
|
opset(AWFMSDB, r)
|
||
|
opset(AVPERM, r)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
op_A uint32 = 0x5A00 // FORMAT_RX1 ADD (32)
|
||
|
op_AD uint32 = 0x6A00 // FORMAT_RX1 ADD NORMALIZED (long HFP)
|
||
|
op_ADB uint32 = 0xED1A // FORMAT_RXE ADD (long BFP)
|
||
|
op_ADBR uint32 = 0xB31A // FORMAT_RRE ADD (long BFP)
|
||
|
op_ADR uint32 = 0x2A00 // FORMAT_RR ADD NORMALIZED (long HFP)
|
||
|
op_ADTR uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
|
||
|
op_ADTRA uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
|
||
|
op_AE uint32 = 0x7A00 // FORMAT_RX1 ADD NORMALIZED (short HFP)
|
||
|
op_AEB uint32 = 0xED0A // FORMAT_RXE ADD (short BFP)
|
||
|
op_AEBR uint32 = 0xB30A // FORMAT_RRE ADD (short BFP)
|
||
|
op_AER uint32 = 0x3A00 // FORMAT_RR ADD NORMALIZED (short HFP)
|
||
|
op_AFI uint32 = 0xC209 // FORMAT_RIL1 ADD IMMEDIATE (32)
|
||
|
op_AG uint32 = 0xE308 // FORMAT_RXY1 ADD (64)
|
||
|
op_AGF uint32 = 0xE318 // FORMAT_RXY1 ADD (64<-32)
|
||
|
op_AGFI uint32 = 0xC208 // FORMAT_RIL1 ADD IMMEDIATE (64<-32)
|
||
|
op_AGFR uint32 = 0xB918 // FORMAT_RRE ADD (64<-32)
|
||
|
op_AGHI uint32 = 0xA70B // FORMAT_RI1 ADD HALFWORD IMMEDIATE (64)
|
||
|
op_AGHIK uint32 = 0xECD9 // FORMAT_RIE4 ADD IMMEDIATE (64<-16)
|
||
|
op_AGR uint32 = 0xB908 // FORMAT_RRE ADD (64)
|
||
|
op_AGRK uint32 = 0xB9E8 // FORMAT_RRF1 ADD (64)
|
||
|
op_AGSI uint32 = 0xEB7A // FORMAT_SIY ADD IMMEDIATE (64<-8)
|
||
|
op_AH uint32 = 0x4A00 // FORMAT_RX1 ADD HALFWORD
|
||
|
op_AHHHR uint32 = 0xB9C8 // FORMAT_RRF1 ADD HIGH (32)
|
||
|
op_AHHLR uint32 = 0xB9D8 // FORMAT_RRF1 ADD HIGH (32)
|
||
|
op_AHI uint32 = 0xA70A // FORMAT_RI1 ADD HALFWORD IMMEDIATE (32)
|
||
|
op_AHIK uint32 = 0xECD8 // FORMAT_RIE4 ADD IMMEDIATE (32<-16)
|
||
|
op_AHY uint32 = 0xE37A // FORMAT_RXY1 ADD HALFWORD
|
||
|
op_AIH uint32 = 0xCC08 // FORMAT_RIL1 ADD IMMEDIATE HIGH (32)
|
||
|
op_AL uint32 = 0x5E00 // FORMAT_RX1 ADD LOGICAL (32)
|
||
|
op_ALC uint32 = 0xE398 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (32)
|
||
|
op_ALCG uint32 = 0xE388 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (64)
|
||
|
op_ALCGR uint32 = 0xB988 // FORMAT_RRE ADD LOGICAL WITH CARRY (64)
|
||
|
op_ALCR uint32 = 0xB998 // FORMAT_RRE ADD LOGICAL WITH CARRY (32)
|
||
|
op_ALFI uint32 = 0xC20B // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (32)
|
||
|
op_ALG uint32 = 0xE30A // FORMAT_RXY1 ADD LOGICAL (64)
|
||
|
op_ALGF uint32 = 0xE31A // FORMAT_RXY1 ADD LOGICAL (64<-32)
|
||
|
op_ALGFI uint32 = 0xC20A // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (64<-32)
|
||
|
op_ALGFR uint32 = 0xB91A // FORMAT_RRE ADD LOGICAL (64<-32)
|
||
|
op_ALGHSIK uint32 = 0xECDB // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (64<-16)
|
||
|
op_ALGR uint32 = 0xB90A // FORMAT_RRE ADD LOGICAL (64)
|
||
|
op_ALGRK uint32 = 0xB9EA // FORMAT_RRF1 ADD LOGICAL (64)
|
||
|
op_ALGSI uint32 = 0xEB7E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (64<-8)
|
||
|
op_ALHHHR uint32 = 0xB9CA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
|
||
|
op_ALHHLR uint32 = 0xB9DA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
|
||
|
op_ALHSIK uint32 = 0xECDA // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (32<-16)
|
||
|
op_ALR uint32 = 0x1E00 // FORMAT_RR ADD LOGICAL (32)
|
||
|
op_ALRK uint32 = 0xB9FA // FORMAT_RRF1 ADD LOGICAL (32)
|
||
|
op_ALSI uint32 = 0xEB6E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (32<-8)
|
||
|
op_ALSIH uint32 = 0xCC0A // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
|
||
|
op_ALSIHN uint32 = 0xCC0B // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
|
||
|
op_ALY uint32 = 0xE35E // FORMAT_RXY1 ADD LOGICAL (32)
|
||
|
op_AP uint32 = 0xFA00 // FORMAT_SS2 ADD DECIMAL
|
||
|
op_AR uint32 = 0x1A00 // FORMAT_RR ADD (32)
|
||
|
op_ARK uint32 = 0xB9F8 // FORMAT_RRF1 ADD (32)
|
||
|
op_ASI uint32 = 0xEB6A // FORMAT_SIY ADD IMMEDIATE (32<-8)
|
||
|
op_AU uint32 = 0x7E00 // FORMAT_RX1 ADD UNNORMALIZED (short HFP)
|
||
|
op_AUR uint32 = 0x3E00 // FORMAT_RR ADD UNNORMALIZED (short HFP)
|
||
|
op_AW uint32 = 0x6E00 // FORMAT_RX1 ADD UNNORMALIZED (long HFP)
|
||
|
op_AWR uint32 = 0x2E00 // FORMAT_RR ADD UNNORMALIZED (long HFP)
|
||
|
op_AXBR uint32 = 0xB34A // FORMAT_RRE ADD (extended BFP)
|
||
|
op_AXR uint32 = 0x3600 // FORMAT_RR ADD NORMALIZED (extended HFP)
|
||
|
op_AXTR uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
|
||
|
op_AXTRA uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
|
||
|
op_AY uint32 = 0xE35A // FORMAT_RXY1 ADD (32)
|
||
|
op_BAKR uint32 = 0xB240 // FORMAT_RRE BRANCH AND STACK
|
||
|
op_BAL uint32 = 0x4500 // FORMAT_RX1 BRANCH AND LINK
|
||
|
op_BALR uint32 = 0x0500 // FORMAT_RR BRANCH AND LINK
|
||
|
op_BAS uint32 = 0x4D00 // FORMAT_RX1 BRANCH AND SAVE
|
||
|
op_BASR uint32 = 0x0D00 // FORMAT_RR BRANCH AND SAVE
|
||
|
op_BASSM uint32 = 0x0C00 // FORMAT_RR BRANCH AND SAVE AND SET MODE
|
||
|
op_BC uint32 = 0x4700 // FORMAT_RX2 BRANCH ON CONDITION
|
||
|
op_BCR uint32 = 0x0700 // FORMAT_RR BRANCH ON CONDITION
|
||
|
op_BCT uint32 = 0x4600 // FORMAT_RX1 BRANCH ON COUNT (32)
|
||
|
op_BCTG uint32 = 0xE346 // FORMAT_RXY1 BRANCH ON COUNT (64)
|
||
|
op_BCTGR uint32 = 0xB946 // FORMAT_RRE BRANCH ON COUNT (64)
|
||
|
op_BCTR uint32 = 0x0600 // FORMAT_RR BRANCH ON COUNT (32)
|
||
|
op_BPP uint32 = 0xC700 // FORMAT_SMI BRANCH PREDICTION PRELOAD
|
||
|
op_BPRP uint32 = 0xC500 // FORMAT_MII BRANCH PREDICTION RELATIVE PRELOAD
|
||
|
op_BRAS uint32 = 0xA705 // FORMAT_RI2 BRANCH RELATIVE AND SAVE
|
||
|
op_BRASL uint32 = 0xC005 // FORMAT_RIL2 BRANCH RELATIVE AND SAVE LONG
|
||
|
op_BRC uint32 = 0xA704 // FORMAT_RI3 BRANCH RELATIVE ON CONDITION
|
||
|
op_BRCL uint32 = 0xC004 // FORMAT_RIL3 BRANCH RELATIVE ON CONDITION LONG
|
||
|
op_BRCT uint32 = 0xA706 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (32)
|
||
|
op_BRCTG uint32 = 0xA707 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (64)
|
||
|
op_BRCTH uint32 = 0xCC06 // FORMAT_RIL2 BRANCH RELATIVE ON COUNT HIGH (32)
|
||
|
op_BRXH uint32 = 0x8400 // FORMAT_RSI BRANCH RELATIVE ON INDEX HIGH (32)
|
||
|
op_BRXHG uint32 = 0xEC44 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX HIGH (64)
|
||
|
op_BRXLE uint32 = 0x8500 // FORMAT_RSI BRANCH RELATIVE ON INDEX LOW OR EQ. (32)
|
||
|
op_BRXLG uint32 = 0xEC45 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX LOW OR EQ. (64)
|
||
|
op_BSA uint32 = 0xB25A // FORMAT_RRE BRANCH AND SET AUTHORITY
|
||
|
op_BSG uint32 = 0xB258 // FORMAT_RRE BRANCH IN SUBSPACE GROUP
|
||
|
op_BSM uint32 = 0x0B00 // FORMAT_RR BRANCH AND SET MODE
|
||
|
op_BXH uint32 = 0x8600 // FORMAT_RS1 BRANCH ON INDEX HIGH (32)
|
||
|
op_BXHG uint32 = 0xEB44 // FORMAT_RSY1 BRANCH ON INDEX HIGH (64)
|
||
|
op_BXLE uint32 = 0x8700 // FORMAT_RS1 BRANCH ON INDEX LOW OR EQUAL (32)
|
||
|
op_BXLEG uint32 = 0xEB45 // FORMAT_RSY1 BRANCH ON INDEX LOW OR EQUAL (64)
|
||
|
op_C uint32 = 0x5900 // FORMAT_RX1 COMPARE (32)
|
||
|
op_CD uint32 = 0x6900 // FORMAT_RX1 COMPARE (long HFP)
|
||
|
op_CDB uint32 = 0xED19 // FORMAT_RXE COMPARE (long BFP)
|
||
|
op_CDBR uint32 = 0xB319 // FORMAT_RRE COMPARE (long BFP)
|
||
|
op_CDFBR uint32 = 0xB395 // FORMAT_RRE CONVERT FROM FIXED (32 to long BFP)
|
||
|
op_CDFBRA uint32 = 0xB395 // FORMAT_RRF5 CONVERT FROM FIXED (32 to long BFP)
|
||
|
op_CDFR uint32 = 0xB3B5 // FORMAT_RRE CONVERT FROM FIXED (32 to long HFP)
|
||
|
op_CDFTR uint32 = 0xB951 // FORMAT_RRE CONVERT FROM FIXED (32 to long DFP)
|
||
|
op_CDGBR uint32 = 0xB3A5 // FORMAT_RRE CONVERT FROM FIXED (64 to long BFP)
|
||
|
op_CDGBRA uint32 = 0xB3A5 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long BFP)
|
||
|
op_CDGR uint32 = 0xB3C5 // FORMAT_RRE CONVERT FROM FIXED (64 to long HFP)
|
||
|
op_CDGTR uint32 = 0xB3F1 // FORMAT_RRE CONVERT FROM FIXED (64 to long DFP)
|
||
|
op_CDGTRA uint32 = 0xB3F1 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long DFP)
|
||
|
op_CDLFBR uint32 = 0xB391 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long BFP)
|
||
|
op_CDLFTR uint32 = 0xB953 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long DFP)
|
||
|
op_CDLGBR uint32 = 0xB3A1 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long BFP)
|
||
|
op_CDLGTR uint32 = 0xB952 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long DFP)
|
||
|
op_CDR uint32 = 0x2900 // FORMAT_RR COMPARE (long HFP)
|
||
|
op_CDS uint32 = 0xBB00 // FORMAT_RS1 COMPARE DOUBLE AND SWAP (32)
|
||
|
op_CDSG uint32 = 0xEB3E // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (64)
|
||
|
op_CDSTR uint32 = 0xB3F3 // FORMAT_RRE CONVERT FROM SIGNED PACKED (64 to long DFP)
|
||
|
op_CDSY uint32 = 0xEB31 // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (32)
|
||
|
op_CDTR uint32 = 0xB3E4 // FORMAT_RRE COMPARE (long DFP)
|
||
|
op_CDUTR uint32 = 0xB3F2 // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (64 to long DFP)
|
||
|
op_CDZT uint32 = 0xEDAA // FORMAT_RSL CONVERT FROM ZONED (to long DFP)
|
||
|
op_CE uint32 = 0x7900 // FORMAT_RX1 COMPARE (short HFP)
|
||
|
op_CEB uint32 = 0xED09 // FORMAT_RXE COMPARE (short BFP)
|
||
|
op_CEBR uint32 = 0xB309 // FORMAT_RRE COMPARE (short BFP)
|
||
|
op_CEDTR uint32 = 0xB3F4 // FORMAT_RRE COMPARE BIASED EXPONENT (long DFP)
|
||
|
op_CEFBR uint32 = 0xB394 // FORMAT_RRE CONVERT FROM FIXED (32 to short BFP)
|
||
|
op_CEFBRA uint32 = 0xB394 // FORMAT_RRF5 CONVERT FROM FIXED (32 to short BFP)
|
||
|
op_CEFR uint32 = 0xB3B4 // FORMAT_RRE CONVERT FROM FIXED (32 to short HFP)
|
||
|
op_CEGBR uint32 = 0xB3A4 // FORMAT_RRE CONVERT FROM FIXED (64 to short BFP)
|
||
|
op_CEGBRA uint32 = 0xB3A4 // FORMAT_RRF5 CONVERT FROM FIXED (64 to short BFP)
|
||
|
op_CEGR uint32 = 0xB3C4 // FORMAT_RRE CONVERT FROM FIXED (64 to short HFP)
|
||
|
op_CELFBR uint32 = 0xB390 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to short BFP)
|
||
|
op_CELGBR uint32 = 0xB3A0 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to short BFP)
|
||
|
op_CER uint32 = 0x3900 // FORMAT_RR COMPARE (short HFP)
|
||
|
op_CEXTR uint32 = 0xB3FC // FORMAT_RRE COMPARE BIASED EXPONENT (extended DFP)
|
||
|
op_CFC uint32 = 0xB21A // FORMAT_S COMPARE AND FORM CODEWORD
|
||
|
op_CFDBR uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
|
||
|
op_CFDBRA uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
|
||
|
op_CFDR uint32 = 0xB3B9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 32)
|
||
|
op_CFDTR uint32 = 0xB941 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 32)
|
||
|
op_CFEBR uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
|
||
|
op_CFEBRA uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
|
||
|
op_CFER uint32 = 0xB3B8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 32)
|
||
|
op_CFI uint32 = 0xC20D // FORMAT_RIL1 COMPARE IMMEDIATE (32)
|
||
|
op_CFXBR uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
|
||
|
op_CFXBRA uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
|
||
|
op_CFXR uint32 = 0xB3BA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 32)
|
||
|
op_CFXTR uint32 = 0xB949 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 32)
|
||
|
op_CG uint32 = 0xE320 // FORMAT_RXY1 COMPARE (64)
|
||
|
op_CGDBR uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
|
||
|
op_CGDBRA uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
|
||
|
op_CGDR uint32 = 0xB3C9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 64)
|
||
|
op_CGDTR uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
|
||
|
op_CGDTRA uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
|
||
|
op_CGEBR uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
|
||
|
op_CGEBRA uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
|
||
|
op_CGER uint32 = 0xB3C8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 64)
|
||
|
op_CGF uint32 = 0xE330 // FORMAT_RXY1 COMPARE (64<-32)
|
||
|
op_CGFI uint32 = 0xC20C // FORMAT_RIL1 COMPARE IMMEDIATE (64<-32)
|
||
|
op_CGFR uint32 = 0xB930 // FORMAT_RRE COMPARE (64<-32)
|
||
|
op_CGFRL uint32 = 0xC60C // FORMAT_RIL2 COMPARE RELATIVE LONG (64<-32)
|
||
|
op_CGH uint32 = 0xE334 // FORMAT_RXY1 COMPARE HALFWORD (64<-16)
|
||
|
op_CGHI uint32 = 0xA70F // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (64<-16)
|
||
|
op_CGHRL uint32 = 0xC604 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (64<-16)
|
||
|
op_CGHSI uint32 = 0xE558 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (64<-16)
|
||
|
op_CGIB uint32 = 0xECFC // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (64<-8)
|
||
|
op_CGIJ uint32 = 0xEC7C // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (64<-8)
|
||
|
op_CGIT uint32 = 0xEC70 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (64<-16)
|
||
|
op_CGR uint32 = 0xB920 // FORMAT_RRE COMPARE (64)
|
||
|
op_CGRB uint32 = 0xECE4 // FORMAT_RRS COMPARE AND BRANCH (64)
|
||
|
op_CGRJ uint32 = 0xEC64 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (64)
|
||
|
op_CGRL uint32 = 0xC608 // FORMAT_RIL2 COMPARE RELATIVE LONG (64)
|
||
|
op_CGRT uint32 = 0xB960 // FORMAT_RRF3 COMPARE AND TRAP (64)
|
||
|
op_CGXBR uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
|
||
|
op_CGXBRA uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
|
||
|
op_CGXR uint32 = 0xB3CA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 64)
|
||
|
op_CGXTR uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
|
||
|
op_CGXTRA uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
|
||
|
op_CH uint32 = 0x4900 // FORMAT_RX1 COMPARE HALFWORD (32<-16)
|
||
|
op_CHF uint32 = 0xE3CD // FORMAT_RXY1 COMPARE HIGH (32)
|
||
|
op_CHHR uint32 = 0xB9CD // FORMAT_RRE COMPARE HIGH (32)
|
||
|
op_CHHSI uint32 = 0xE554 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (16)
|
||
|
op_CHI uint32 = 0xA70E // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (32<-16)
|
||
|
op_CHLR uint32 = 0xB9DD // FORMAT_RRE COMPARE HIGH (32)
|
||
|
op_CHRL uint32 = 0xC605 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (32<-16)
|
||
|
op_CHSI uint32 = 0xE55C // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (32<-16)
|
||
|
op_CHY uint32 = 0xE379 // FORMAT_RXY1 COMPARE HALFWORD (32<-16)
|
||
|
op_CIB uint32 = 0xECFE // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (32<-8)
|
||
|
op_CIH uint32 = 0xCC0D // FORMAT_RIL1 COMPARE IMMEDIATE HIGH (32)
|
||
|
op_CIJ uint32 = 0xEC7E // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (32<-8)
|
||
|
op_CIT uint32 = 0xEC72 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (32<-16)
|
||
|
op_CKSM uint32 = 0xB241 // FORMAT_RRE CHECKSUM
|
||
|
op_CL uint32 = 0x5500 // FORMAT_RX1 COMPARE LOGICAL (32)
|
||
|
op_CLC uint32 = 0xD500 // FORMAT_SS1 COMPARE LOGICAL (character)
|
||
|
op_CLCL uint32 = 0x0F00 // FORMAT_RR COMPARE LOGICAL LONG
|
||
|
op_CLCLE uint32 = 0xA900 // FORMAT_RS1 COMPARE LOGICAL LONG EXTENDED
|
||
|
op_CLCLU uint32 = 0xEB8F // FORMAT_RSY1 COMPARE LOGICAL LONG UNICODE
|
||
|
op_CLFDBR uint32 = 0xB39D // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 32)
|
||
|
op_CLFDTR uint32 = 0xB943 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 32)
|
||
|
op_CLFEBR uint32 = 0xB39C // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 32)
|
||
|
op_CLFHSI uint32 = 0xE55D // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (32<-16)
|
||
|
op_CLFI uint32 = 0xC20F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (32)
|
||
|
op_CLFIT uint32 = 0xEC73 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (32<-16)
|
||
|
op_CLFXBR uint32 = 0xB39E // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 32)
|
||
|
op_CLFXTR uint32 = 0xB94B // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 32)
|
||
|
op_CLG uint32 = 0xE321 // FORMAT_RXY1 COMPARE LOGICAL (64)
|
||
|
op_CLGDBR uint32 = 0xB3AD // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 64)
|
||
|
op_CLGDTR uint32 = 0xB942 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 64)
|
||
|
op_CLGEBR uint32 = 0xB3AC // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 64)
|
||
|
op_CLGF uint32 = 0xE331 // FORMAT_RXY1 COMPARE LOGICAL (64<-32)
|
||
|
op_CLGFI uint32 = 0xC20E // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (64<-32)
|
||
|
op_CLGFR uint32 = 0xB931 // FORMAT_RRE COMPARE LOGICAL (64<-32)
|
||
|
op_CLGFRL uint32 = 0xC60E // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-32)
|
||
|
op_CLGHRL uint32 = 0xC606 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-16)
|
||
|
op_CLGHSI uint32 = 0xE559 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (64<-16)
|
||
|
op_CLGIB uint32 = 0xECFD // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (64<-8)
|
||
|
op_CLGIJ uint32 = 0xEC7D // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (64<-8)
|
||
|
op_CLGIT uint32 = 0xEC71 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (64<-16)
|
||
|
op_CLGR uint32 = 0xB921 // FORMAT_RRE COMPARE LOGICAL (64)
|
||
|
op_CLGRB uint32 = 0xECE5 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (64)
|
||
|
op_CLGRJ uint32 = 0xEC65 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (64)
|
||
|
op_CLGRL uint32 = 0xC60A // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64)
|
||
|
op_CLGRT uint32 = 0xB961 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (64)
|
||
|
op_CLGT uint32 = 0xEB2B // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (64)
|
||
|
op_CLGXBR uint32 = 0xB3AE // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 64)
|
||
|
op_CLGXTR uint32 = 0xB94A // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 64)
|
||
|
op_CLHF uint32 = 0xE3CF // FORMAT_RXY1 COMPARE LOGICAL HIGH (32)
|
||
|
op_CLHHR uint32 = 0xB9CF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
|
||
|
op_CLHHSI uint32 = 0xE555 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (16)
|
||
|
op_CLHLR uint32 = 0xB9DF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
|
||
|
op_CLHRL uint32 = 0xC607 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32<-16)
|
||
|
op_CLI uint32 = 0x9500 // FORMAT_SI COMPARE LOGICAL (immediate)
|
||
|
op_CLIB uint32 = 0xECFF // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (32<-8)
|
||
|
op_CLIH uint32 = 0xCC0F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE HIGH (32)
|
||
|
op_CLIJ uint32 = 0xEC7F // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (32<-8)
|
||
|
op_CLIY uint32 = 0xEB55 // FORMAT_SIY COMPARE LOGICAL (immediate)
|
||
|
op_CLM uint32 = 0xBD00 // FORMAT_RS2 COMPARE LOGICAL CHAR. UNDER MASK (low)
|
||
|
op_CLMH uint32 = 0xEB20 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (high)
|
||
|
op_CLMY uint32 = 0xEB21 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (low)
|
||
|
op_CLR uint32 = 0x1500 // FORMAT_RR COMPARE LOGICAL (32)
|
||
|
op_CLRB uint32 = 0xECF7 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (32)
|
||
|
op_CLRJ uint32 = 0xEC77 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (32)
|
||
|
op_CLRL uint32 = 0xC60F // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32)
|
||
|
op_CLRT uint32 = 0xB973 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (32)
|
||
|
op_CLST uint32 = 0xB25D // FORMAT_RRE COMPARE LOGICAL STRING
|
||
|
op_CLT uint32 = 0xEB23 // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (32)
|
||
|
op_CLY uint32 = 0xE355 // FORMAT_RXY1 COMPARE LOGICAL (32)
|
||
|
op_CMPSC uint32 = 0xB263 // FORMAT_RRE COMPRESSION CALL
|
||
|
op_CP uint32 = 0xF900 // FORMAT_SS2 COMPARE DECIMAL
|
||
|
op_CPSDR uint32 = 0xB372 // FORMAT_RRF2 COPY SIGN (long)
|
||
|
op_CPYA uint32 = 0xB24D // FORMAT_RRE COPY ACCESS
|
||
|
op_CR uint32 = 0x1900 // FORMAT_RR COMPARE (32)
|
||
|
op_CRB uint32 = 0xECF6 // FORMAT_RRS COMPARE AND BRANCH (32)
|
||
|
op_CRDTE uint32 = 0xB98F // FORMAT_RRF2 COMPARE AND REPLACE DAT TABLE ENTRY
|
||
|
op_CRJ uint32 = 0xEC76 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (32)
|
||
|
op_CRL uint32 = 0xC60D // FORMAT_RIL2 COMPARE RELATIVE LONG (32)
|
||
|
op_CRT uint32 = 0xB972 // FORMAT_RRF3 COMPARE AND TRAP (32)
|
||
|
op_CS uint32 = 0xBA00 // FORMAT_RS1 COMPARE AND SWAP (32)
|
||
|
op_CSCH uint32 = 0xB230 // FORMAT_S CLEAR SUBCHANNEL
|
||
|
op_CSDTR uint32 = 0xB3E3 // FORMAT_RRF4 CONVERT TO SIGNED PACKED (long DFP to 64)
|
||
|
op_CSG uint32 = 0xEB30 // FORMAT_RSY1 COMPARE AND SWAP (64)
|
||
|
op_CSP uint32 = 0xB250 // FORMAT_RRE COMPARE AND SWAP AND PURGE
|
||
|
op_CSPG uint32 = 0xB98A // FORMAT_RRE COMPARE AND SWAP AND PURGE
|
||
|
op_CSST uint32 = 0xC802 // FORMAT_SSF COMPARE AND SWAP AND STORE
|
||
|
op_CSXTR uint32 = 0xB3EB // FORMAT_RRF4 CONVERT TO SIGNED PACKED (extended DFP to 128)
|
||
|
op_CSY uint32 = 0xEB14 // FORMAT_RSY1 COMPARE AND SWAP (32)
|
||
|
op_CU12 uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-16
|
||
|
op_CU14 uint32 = 0xB9B0 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-32
|
||
|
op_CU21 uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-8
|
||
|
op_CU24 uint32 = 0xB9B1 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-32
|
||
|
op_CU41 uint32 = 0xB9B2 // FORMAT_RRE CONVERT UTF-32 TO UTF-8
|
||
|
op_CU42 uint32 = 0xB9B3 // FORMAT_RRE CONVERT UTF-32 TO UTF-16
|
||
|
op_CUDTR uint32 = 0xB3E2 // FORMAT_RRE CONVERT TO UNSIGNED PACKED (long DFP to 64)
|
||
|
op_CUSE uint32 = 0xB257 // FORMAT_RRE COMPARE UNTIL SUBSTRING EQUAL
|
||
|
op_CUTFU uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UNICODE
|
||
|
op_CUUTF uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UNICODE TO UTF-8
|
||
|
op_CUXTR uint32 = 0xB3EA // FORMAT_RRE CONVERT TO UNSIGNED PACKED (extended DFP to 128)
|
||
|
op_CVB uint32 = 0x4F00 // FORMAT_RX1 CONVERT TO BINARY (32)
|
||
|
op_CVBG uint32 = 0xE30E // FORMAT_RXY1 CONVERT TO BINARY (64)
|
||
|
op_CVBY uint32 = 0xE306 // FORMAT_RXY1 CONVERT TO BINARY (32)
|
||
|
op_CVD uint32 = 0x4E00 // FORMAT_RX1 CONVERT TO DECIMAL (32)
|
||
|
op_CVDG uint32 = 0xE32E // FORMAT_RXY1 CONVERT TO DECIMAL (64)
|
||
|
op_CVDY uint32 = 0xE326 // FORMAT_RXY1 CONVERT TO DECIMAL (32)
|
||
|
op_CXBR uint32 = 0xB349 // FORMAT_RRE COMPARE (extended BFP)
|
||
|
op_CXFBR uint32 = 0xB396 // FORMAT_RRE CONVERT FROM FIXED (32 to extended BFP)
|
||
|
op_CXFBRA uint32 = 0xB396 // FORMAT_RRF5 CONVERT FROM FIXED (32 to extended BFP)
|
||
|
op_CXFR uint32 = 0xB3B6 // FORMAT_RRE CONVERT FROM FIXED (32 to extended HFP)
|
||
|
op_CXFTR uint32 = 0xB959 // FORMAT_RRE CONVERT FROM FIXED (32 to extended DFP)
|
||
|
op_CXGBR uint32 = 0xB3A6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended BFP)
|
||
|
op_CXGBRA uint32 = 0xB3A6 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended BFP)
|
||
|
op_CXGR uint32 = 0xB3C6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended HFP)
|
||
|
op_CXGTR uint32 = 0xB3F9 // FORMAT_RRE CONVERT FROM FIXED (64 to extended DFP)
|
||
|
op_CXGTRA uint32 = 0xB3F9 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended DFP)
|
||
|
op_CXLFBR uint32 = 0xB392 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended BFP)
|
||
|
op_CXLFTR uint32 = 0xB95B // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended DFP)
|
||
|
op_CXLGBR uint32 = 0xB3A2 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended BFP)
|
||
|
op_CXLGTR uint32 = 0xB95A // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended DFP)
|
||
|
op_CXR uint32 = 0xB369 // FORMAT_RRE COMPARE (extended HFP)
|
||
|
op_CXSTR uint32 = 0xB3FB // FORMAT_RRE CONVERT FROM SIGNED PACKED (128 to extended DFP)
|
||
|
op_CXTR uint32 = 0xB3EC // FORMAT_RRE COMPARE (extended DFP)
|
||
|
op_CXUTR uint32 = 0xB3FA // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (128 to ext. DFP)
|
||
|
op_CXZT uint32 = 0xEDAB // FORMAT_RSL CONVERT FROM ZONED (to extended DFP)
|
||
|
op_CY uint32 = 0xE359 // FORMAT_RXY1 COMPARE (32)
|
||
|
op_CZDT uint32 = 0xEDA8 // FORMAT_RSL CONVERT TO ZONED (from long DFP)
|
||
|
op_CZXT uint32 = 0xEDA9 // FORMAT_RSL CONVERT TO ZONED (from extended DFP)
|
||
|
op_D uint32 = 0x5D00 // FORMAT_RX1 DIVIDE (32<-64)
|
||
|
op_DD uint32 = 0x6D00 // FORMAT_RX1 DIVIDE (long HFP)
|
||
|
op_DDB uint32 = 0xED1D // FORMAT_RXE DIVIDE (long BFP)
|
||
|
op_DDBR uint32 = 0xB31D // FORMAT_RRE DIVIDE (long BFP)
|
||
|
op_DDR uint32 = 0x2D00 // FORMAT_RR DIVIDE (long HFP)
|
||
|
op_DDTR uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
|
||
|
op_DDTRA uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
|
||
|
op_DE uint32 = 0x7D00 // FORMAT_RX1 DIVIDE (short HFP)
|
||
|
op_DEB uint32 = 0xED0D // FORMAT_RXE DIVIDE (short BFP)
|
||
|
op_DEBR uint32 = 0xB30D // FORMAT_RRE DIVIDE (short BFP)
|
||
|
op_DER uint32 = 0x3D00 // FORMAT_RR DIVIDE (short HFP)
|
||
|
op_DIDBR uint32 = 0xB35B // FORMAT_RRF2 DIVIDE TO INTEGER (long BFP)
|
||
|
op_DIEBR uint32 = 0xB353 // FORMAT_RRF2 DIVIDE TO INTEGER (short BFP)
|
||
|
op_DL uint32 = 0xE397 // FORMAT_RXY1 DIVIDE LOGICAL (32<-64)
|
||
|
op_DLG uint32 = 0xE387 // FORMAT_RXY1 DIVIDE LOGICAL (64<-128)
|
||
|
op_DLGR uint32 = 0xB987 // FORMAT_RRE DIVIDE LOGICAL (64<-128)
|
||
|
op_DLR uint32 = 0xB997 // FORMAT_RRE DIVIDE LOGICAL (32<-64)
|
||
|
op_DP uint32 = 0xFD00 // FORMAT_SS2 DIVIDE DECIMAL
|
||
|
op_DR uint32 = 0x1D00 // FORMAT_RR DIVIDE (32<-64)
|
||
|
op_DSG uint32 = 0xE30D // FORMAT_RXY1 DIVIDE SINGLE (64)
|
||
|
op_DSGF uint32 = 0xE31D // FORMAT_RXY1 DIVIDE SINGLE (64<-32)
|
||
|
op_DSGFR uint32 = 0xB91D // FORMAT_RRE DIVIDE SINGLE (64<-32)
|
||
|
op_DSGR uint32 = 0xB90D // FORMAT_RRE DIVIDE SINGLE (64)
|
||
|
op_DXBR uint32 = 0xB34D // FORMAT_RRE DIVIDE (extended BFP)
|
||
|
op_DXR uint32 = 0xB22D // FORMAT_RRE DIVIDE (extended HFP)
|
||
|
op_DXTR uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
|
||
|
op_DXTRA uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
|
||
|
op_EAR uint32 = 0xB24F // FORMAT_RRE EXTRACT ACCESS
|
||
|
op_ECAG uint32 = 0xEB4C // FORMAT_RSY1 EXTRACT CACHE ATTRIBUTE
|
||
|
op_ECTG uint32 = 0xC801 // FORMAT_SSF EXTRACT CPU TIME
|
||
|
op_ED uint32 = 0xDE00 // FORMAT_SS1 EDIT
|
||
|
op_EDMK uint32 = 0xDF00 // FORMAT_SS1 EDIT AND MARK
|
||
|
op_EEDTR uint32 = 0xB3E5 // FORMAT_RRE EXTRACT BIASED EXPONENT (long DFP to 64)
|
||
|
op_EEXTR uint32 = 0xB3ED // FORMAT_RRE EXTRACT BIASED EXPONENT (extended DFP to 64)
|
||
|
op_EFPC uint32 = 0xB38C // FORMAT_RRE EXTRACT FPC
|
||
|
op_EPAIR uint32 = 0xB99A // FORMAT_RRE EXTRACT PRIMARY ASN AND INSTANCE
|
||
|
op_EPAR uint32 = 0xB226 // FORMAT_RRE EXTRACT PRIMARY ASN
|
||
|
op_EPSW uint32 = 0xB98D // FORMAT_RRE EXTRACT PSW
|
||
|
op_EREG uint32 = 0xB249 // FORMAT_RRE EXTRACT STACKED REGISTERS (32)
|
||
|
op_EREGG uint32 = 0xB90E // FORMAT_RRE EXTRACT STACKED REGISTERS (64)
|
||
|
op_ESAIR uint32 = 0xB99B // FORMAT_RRE EXTRACT SECONDARY ASN AND INSTANCE
|
||
|
op_ESAR uint32 = 0xB227 // FORMAT_RRE EXTRACT SECONDARY ASN
|
||
|
op_ESDTR uint32 = 0xB3E7 // FORMAT_RRE EXTRACT SIGNIFICANCE (long DFP)
|
||
|
op_ESEA uint32 = 0xB99D // FORMAT_RRE EXTRACT AND SET EXTENDED AUTHORITY
|
||
|
op_ESTA uint32 = 0xB24A // FORMAT_RRE EXTRACT STACKED STATE
|
||
|
op_ESXTR uint32 = 0xB3EF // FORMAT_RRE EXTRACT SIGNIFICANCE (extended DFP)
|
||
|
op_ETND uint32 = 0xB2EC // FORMAT_RRE EXTRACT TRANSACTION NESTING DEPTH
|
||
|
op_EX uint32 = 0x4400 // FORMAT_RX1 EXECUTE
|
||
|
op_EXRL uint32 = 0xC600 // FORMAT_RIL2 EXECUTE RELATIVE LONG
|
||
|
op_FIDBR uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
|
||
|
op_FIDBRA uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
|
||
|
op_FIDR uint32 = 0xB37F // FORMAT_RRE LOAD FP INTEGER (long HFP)
|
||
|
op_FIDTR uint32 = 0xB3D7 // FORMAT_RRF5 LOAD FP INTEGER (long DFP)
|
||
|
op_FIEBR uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
|
||
|
op_FIEBRA uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
|
||
|
op_FIER uint32 = 0xB377 // FORMAT_RRE LOAD FP INTEGER (short HFP)
|
||
|
op_FIXBR uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
|
||
|
op_FIXBRA uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
|
||
|
op_FIXR uint32 = 0xB367 // FORMAT_RRE LOAD FP INTEGER (extended HFP)
|
||
|
op_FIXTR uint32 = 0xB3DF // FORMAT_RRF5 LOAD FP INTEGER (extended DFP)
|
||
|
op_FLOGR uint32 = 0xB983 // FORMAT_RRE FIND LEFTMOST ONE
|
||
|
op_HDR uint32 = 0x2400 // FORMAT_RR HALVE (long HFP)
|
||
|
op_HER uint32 = 0x3400 // FORMAT_RR HALVE (short HFP)
|
||
|
op_HSCH uint32 = 0xB231 // FORMAT_S HALT SUBCHANNEL
|
||
|
op_IAC uint32 = 0xB224 // FORMAT_RRE INSERT ADDRESS SPACE CONTROL
|
||
|
op_IC uint32 = 0x4300 // FORMAT_RX1 INSERT CHARACTER
|
||
|
op_ICM uint32 = 0xBF00 // FORMAT_RS2 INSERT CHARACTERS UNDER MASK (low)
|
||
|
op_ICMH uint32 = 0xEB80 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (high)
|
||
|
op_ICMY uint32 = 0xEB81 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (low)
|
||
|
op_ICY uint32 = 0xE373 // FORMAT_RXY1 INSERT CHARACTER
|
||
|
op_IDTE uint32 = 0xB98E // FORMAT_RRF2 INVALIDATE DAT TABLE ENTRY
|
||
|
op_IEDTR uint32 = 0xB3F6 // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to long DFP)
|
||
|
op_IEXTR uint32 = 0xB3FE // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to extended DFP)
|
||
|
op_IIHF uint32 = 0xC008 // FORMAT_RIL1 INSERT IMMEDIATE (high)
|
||
|
op_IIHH uint32 = 0xA500 // FORMAT_RI1 INSERT IMMEDIATE (high high)
|
||
|
op_IIHL uint32 = 0xA501 // FORMAT_RI1 INSERT IMMEDIATE (high low)
|
||
|
op_IILF uint32 = 0xC009 // FORMAT_RIL1 INSERT IMMEDIATE (low)
|
||
|
op_IILH uint32 = 0xA502 // FORMAT_RI1 INSERT IMMEDIATE (low high)
|
||
|
op_IILL uint32 = 0xA503 // FORMAT_RI1 INSERT IMMEDIATE (low low)
|
||
|
op_IPK uint32 = 0xB20B // FORMAT_S INSERT PSW KEY
|
||
|
op_IPM uint32 = 0xB222 // FORMAT_RRE INSERT PROGRAM MASK
|
||
|
op_IPTE uint32 = 0xB221 // FORMAT_RRF1 INVALIDATE PAGE TABLE ENTRY
|
||
|
op_ISKE uint32 = 0xB229 // FORMAT_RRE INSERT STORAGE KEY EXTENDED
|
||
|
op_IVSK uint32 = 0xB223 // FORMAT_RRE INSERT VIRTUAL STORAGE KEY
|
||
|
op_KDB uint32 = 0xED18 // FORMAT_RXE COMPARE AND SIGNAL (long BFP)
|
||
|
op_KDBR uint32 = 0xB318 // FORMAT_RRE COMPARE AND SIGNAL (long BFP)
|
||
|
op_KDTR uint32 = 0xB3E0 // FORMAT_RRE COMPARE AND SIGNAL (long DFP)
|
||
|
op_KEB uint32 = 0xED08 // FORMAT_RXE COMPARE AND SIGNAL (short BFP)
|
||
|
op_KEBR uint32 = 0xB308 // FORMAT_RRE COMPARE AND SIGNAL (short BFP)
|
||
|
op_KIMD uint32 = 0xB93E // FORMAT_RRE COMPUTE INTERMEDIATE MESSAGE DIGEST
|
||
|
op_KLMD uint32 = 0xB93F // FORMAT_RRE COMPUTE LAST MESSAGE DIGEST
|
||
|
op_KM uint32 = 0xB92E // FORMAT_RRE CIPHER MESSAGE
|
||
|
op_KMAC uint32 = 0xB91E // FORMAT_RRE COMPUTE MESSAGE AUTHENTICATION CODE
|
||
|
op_KMC uint32 = 0xB92F // FORMAT_RRE CIPHER MESSAGE WITH CHAINING
|
||
|
op_KMCTR uint32 = 0xB92D // FORMAT_RRF2 CIPHER MESSAGE WITH COUNTER
|
||
|
op_KMF uint32 = 0xB92A // FORMAT_RRE CIPHER MESSAGE WITH CFB
|
||
|
op_KMO uint32 = 0xB92B // FORMAT_RRE CIPHER MESSAGE WITH OFB
|
||
|
op_KXBR uint32 = 0xB348 // FORMAT_RRE COMPARE AND SIGNAL (extended BFP)
|
||
|
op_KXTR uint32 = 0xB3E8 // FORMAT_RRE COMPARE AND SIGNAL (extended DFP)
|
||
|
op_L uint32 = 0x5800 // FORMAT_RX1 LOAD (32)
|
||
|
op_LA uint32 = 0x4100 // FORMAT_RX1 LOAD ADDRESS
|
||
|
op_LAA uint32 = 0xEBF8 // FORMAT_RSY1 LOAD AND ADD (32)
|
||
|
op_LAAG uint32 = 0xEBE8 // FORMAT_RSY1 LOAD AND ADD (64)
|
||
|
op_LAAL uint32 = 0xEBFA // FORMAT_RSY1 LOAD AND ADD LOGICAL (32)
|
||
|
op_LAALG uint32 = 0xEBEA // FORMAT_RSY1 LOAD AND ADD LOGICAL (64)
|
||
|
op_LAE uint32 = 0x5100 // FORMAT_RX1 LOAD ADDRESS EXTENDED
|
||
|
op_LAEY uint32 = 0xE375 // FORMAT_RXY1 LOAD ADDRESS EXTENDED
|
||
|
op_LAM uint32 = 0x9A00 // FORMAT_RS1 LOAD ACCESS MULTIPLE
|
||
|
op_LAMY uint32 = 0xEB9A // FORMAT_RSY1 LOAD ACCESS MULTIPLE
|
||
|
op_LAN uint32 = 0xEBF4 // FORMAT_RSY1 LOAD AND AND (32)
|
||
|
op_LANG uint32 = 0xEBE4 // FORMAT_RSY1 LOAD AND AND (64)
|
||
|
op_LAO uint32 = 0xEBF6 // FORMAT_RSY1 LOAD AND OR (32)
|
||
|
op_LAOG uint32 = 0xEBE6 // FORMAT_RSY1 LOAD AND OR (64)
|
||
|
op_LARL uint32 = 0xC000 // FORMAT_RIL2 LOAD ADDRESS RELATIVE LONG
|
||
|
op_LASP uint32 = 0xE500 // FORMAT_SSE LOAD ADDRESS SPACE PARAMETERS
|
||
|
op_LAT uint32 = 0xE39F // FORMAT_RXY1 LOAD AND TRAP (32L<-32)
|
||
|
op_LAX uint32 = 0xEBF7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (32)
|
||
|
op_LAXG uint32 = 0xEBE7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (64)
|
||
|
op_LAY uint32 = 0xE371 // FORMAT_RXY1 LOAD ADDRESS
|
||
|
op_LB uint32 = 0xE376 // FORMAT_RXY1 LOAD BYTE (32)
|
||
|
op_LBH uint32 = 0xE3C0 // FORMAT_RXY1 LOAD BYTE HIGH (32<-8)
|
||
|
op_LBR uint32 = 0xB926 // FORMAT_RRE LOAD BYTE (32)
|
||
|
op_LCDBR uint32 = 0xB313 // FORMAT_RRE LOAD COMPLEMENT (long BFP)
|
||
|
op_LCDFR uint32 = 0xB373 // FORMAT_RRE LOAD COMPLEMENT (long)
|
||
|
op_LCDR uint32 = 0x2300 // FORMAT_RR LOAD COMPLEMENT (long HFP)
|
||
|
op_LCEBR uint32 = 0xB303 // FORMAT_RRE LOAD COMPLEMENT (short BFP)
|
||
|
op_LCER uint32 = 0x3300 // FORMAT_RR LOAD COMPLEMENT (short HFP)
|
||
|
op_LCGFR uint32 = 0xB913 // FORMAT_RRE LOAD COMPLEMENT (64<-32)
|
||
|
op_LCGR uint32 = 0xB903 // FORMAT_RRE LOAD COMPLEMENT (64)
|
||
|
op_LCR uint32 = 0x1300 // FORMAT_RR LOAD COMPLEMENT (32)
|
||
|
op_LCTL uint32 = 0xB700 // FORMAT_RS1 LOAD CONTROL (32)
|
||
|
op_LCTLG uint32 = 0xEB2F // FORMAT_RSY1 LOAD CONTROL (64)
|
||
|
op_LCXBR uint32 = 0xB343 // FORMAT_RRE LOAD COMPLEMENT (extended BFP)
|
||
|
op_LCXR uint32 = 0xB363 // FORMAT_RRE LOAD COMPLEMENT (extended HFP)
|
||
|
op_LD uint32 = 0x6800 // FORMAT_RX1 LOAD (long)
|
||
|
op_LDE uint32 = 0xED24 // FORMAT_RXE LOAD LENGTHENED (short to long HFP)
|
||
|
op_LDEB uint32 = 0xED04 // FORMAT_RXE LOAD LENGTHENED (short to long BFP)
|
||
|
op_LDEBR uint32 = 0xB304 // FORMAT_RRE LOAD LENGTHENED (short to long BFP)
|
||
|
op_LDER uint32 = 0xB324 // FORMAT_RRE LOAD LENGTHENED (short to long HFP)
|
||
|
op_LDETR uint32 = 0xB3D4 // FORMAT_RRF4 LOAD LENGTHENED (short to long DFP)
|
||
|
op_LDGR uint32 = 0xB3C1 // FORMAT_RRE LOAD FPR FROM GR (64 to long)
|
||
|
op_LDR uint32 = 0x2800 // FORMAT_RR LOAD (long)
|
||
|
op_LDXBR uint32 = 0xB345 // FORMAT_RRE LOAD ROUNDED (extended to long BFP)
|
||
|
op_LDXBRA uint32 = 0xB345 // FORMAT_RRF5 LOAD ROUNDED (extended to long BFP)
|
||
|
op_LDXR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
|
||
|
op_LDXTR uint32 = 0xB3DD // FORMAT_RRF5 LOAD ROUNDED (extended to long DFP)
|
||
|
op_LDY uint32 = 0xED65 // FORMAT_RXY1 LOAD (long)
|
||
|
op_LE uint32 = 0x7800 // FORMAT_RX1 LOAD (short)
|
||
|
op_LEDBR uint32 = 0xB344 // FORMAT_RRE LOAD ROUNDED (long to short BFP)
|
||
|
op_LEDBRA uint32 = 0xB344 // FORMAT_RRF5 LOAD ROUNDED (long to short BFP)
|
||
|
op_LEDR uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
|
||
|
op_LEDTR uint32 = 0xB3D5 // FORMAT_RRF5 LOAD ROUNDED (long to short DFP)
|
||
|
op_LER uint32 = 0x3800 // FORMAT_RR LOAD (short)
|
||
|
op_LEXBR uint32 = 0xB346 // FORMAT_RRE LOAD ROUNDED (extended to short BFP)
|
||
|
op_LEXBRA uint32 = 0xB346 // FORMAT_RRF5 LOAD ROUNDED (extended to short BFP)
|
||
|
op_LEXR uint32 = 0xB366 // FORMAT_RRE LOAD ROUNDED (extended to short HFP)
|
||
|
op_LEY uint32 = 0xED64 // FORMAT_RXY1 LOAD (short)
|
||
|
op_LFAS uint32 = 0xB2BD // FORMAT_S LOAD FPC AND SIGNAL
|
||
|
op_LFH uint32 = 0xE3CA // FORMAT_RXY1 LOAD HIGH (32)
|
||
|
op_LFHAT uint32 = 0xE3C8 // FORMAT_RXY1 LOAD HIGH AND TRAP (32H<-32)
|
||
|
op_LFPC uint32 = 0xB29D // FORMAT_S LOAD FPC
|
||
|
op_LG uint32 = 0xE304 // FORMAT_RXY1 LOAD (64)
|
||
|
op_LGAT uint32 = 0xE385 // FORMAT_RXY1 LOAD AND TRAP (64)
|
||
|
op_LGB uint32 = 0xE377 // FORMAT_RXY1 LOAD BYTE (64)
|
||
|
op_LGBR uint32 = 0xB906 // FORMAT_RRE LOAD BYTE (64)
|
||
|
op_LGDR uint32 = 0xB3CD // FORMAT_RRE LOAD GR FROM FPR (long to 64)
|
||
|
op_LGF uint32 = 0xE314 // FORMAT_RXY1 LOAD (64<-32)
|
||
|
op_LGFI uint32 = 0xC001 // FORMAT_RIL1 LOAD IMMEDIATE (64<-32)
|
||
|
op_LGFR uint32 = 0xB914 // FORMAT_RRE LOAD (64<-32)
|
||
|
op_LGFRL uint32 = 0xC40C // FORMAT_RIL2 LOAD RELATIVE LONG (64<-32)
|
||
|
op_LGH uint32 = 0xE315 // FORMAT_RXY1 LOAD HALFWORD (64)
|
||
|
op_LGHI uint32 = 0xA709 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (64)
|
||
|
op_LGHR uint32 = 0xB907 // FORMAT_RRE LOAD HALFWORD (64)
|
||
|
op_LGHRL uint32 = 0xC404 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (64<-16)
|
||
|
op_LGR uint32 = 0xB904 // FORMAT_RRE LOAD (64)
|
||
|
op_LGRL uint32 = 0xC408 // FORMAT_RIL2 LOAD RELATIVE LONG (64)
|
||
|
op_LH uint32 = 0x4800 // FORMAT_RX1 LOAD HALFWORD (32)
|
||
|
op_LHH uint32 = 0xE3C4 // FORMAT_RXY1 LOAD HALFWORD HIGH (32<-16)
|
||
|
op_LHI uint32 = 0xA708 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (32)
|
||
|
op_LHR uint32 = 0xB927 // FORMAT_RRE LOAD HALFWORD (32)
|
||
|
op_LHRL uint32 = 0xC405 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (32<-16)
|
||
|
op_LHY uint32 = 0xE378 // FORMAT_RXY1 LOAD HALFWORD (32)
|
||
|
op_LLC uint32 = 0xE394 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (32)
|
||
|
op_LLCH uint32 = 0xE3C2 // FORMAT_RXY1 LOAD LOGICAL CHARACTER HIGH (32<-8)
|
||
|
op_LLCR uint32 = 0xB994 // FORMAT_RRE LOAD LOGICAL CHARACTER (32)
|
||
|
op_LLGC uint32 = 0xE390 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (64)
|
||
|
op_LLGCR uint32 = 0xB984 // FORMAT_RRE LOAD LOGICAL CHARACTER (64)
|
||
|
op_LLGF uint32 = 0xE316 // FORMAT_RXY1 LOAD LOGICAL (64<-32)
|
||
|
op_LLGFAT uint32 = 0xE39D // FORMAT_RXY1 LOAD LOGICAL AND TRAP (64<-32)
|
||
|
op_LLGFR uint32 = 0xB916 // FORMAT_RRE LOAD LOGICAL (64<-32)
|
||
|
op_LLGFRL uint32 = 0xC40E // FORMAT_RIL2 LOAD LOGICAL RELATIVE LONG (64<-32)
|
||
|
op_LLGH uint32 = 0xE391 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (64)
|
||
|
op_LLGHR uint32 = 0xB985 // FORMAT_RRE LOAD LOGICAL HALFWORD (64)
|
||
|
op_LLGHRL uint32 = 0xC406 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (64<-16)
|
||
|
op_LLGT uint32 = 0xE317 // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS
|
||
|
op_LLGTAT uint32 = 0xE39C // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS AND TRAP (64<-31)
|
||
|
op_LLGTR uint32 = 0xB917 // FORMAT_RRE LOAD LOGICAL THIRTY ONE BITS
|
||
|
op_LLH uint32 = 0xE395 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (32)
|
||
|
op_LLHH uint32 = 0xE3C6 // FORMAT_RXY1 LOAD LOGICAL HALFWORD HIGH (32<-16)
|
||
|
op_LLHR uint32 = 0xB995 // FORMAT_RRE LOAD LOGICAL HALFWORD (32)
|
||
|
op_LLHRL uint32 = 0xC402 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (32<-16)
|
||
|
op_LLIHF uint32 = 0xC00E // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (high)
|
||
|
op_LLIHH uint32 = 0xA50C // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high high)
|
||
|
op_LLIHL uint32 = 0xA50D // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high low)
|
||
|
op_LLILF uint32 = 0xC00F // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (low)
|
||
|
op_LLILH uint32 = 0xA50E // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low high)
|
||
|
op_LLILL uint32 = 0xA50F // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low low)
|
||
|
op_LM uint32 = 0x9800 // FORMAT_RS1 LOAD MULTIPLE (32)
|
||
|
op_LMD uint32 = 0xEF00 // FORMAT_SS5 LOAD MULTIPLE DISJOINT
|
||
|
op_LMG uint32 = 0xEB04 // FORMAT_RSY1 LOAD MULTIPLE (64)
|
||
|
op_LMH uint32 = 0xEB96 // FORMAT_RSY1 LOAD MULTIPLE HIGH
|
||
|
op_LMY uint32 = 0xEB98 // FORMAT_RSY1 LOAD MULTIPLE (32)
|
||
|
op_LNDBR uint32 = 0xB311 // FORMAT_RRE LOAD NEGATIVE (long BFP)
|
||
|
op_LNDFR uint32 = 0xB371 // FORMAT_RRE LOAD NEGATIVE (long)
|
||
|
op_LNDR uint32 = 0x2100 // FORMAT_RR LOAD NEGATIVE (long HFP)
|
||
|
op_LNEBR uint32 = 0xB301 // FORMAT_RRE LOAD NEGATIVE (short BFP)
|
||
|
op_LNER uint32 = 0x3100 // FORMAT_RR LOAD NEGATIVE (short HFP)
|
||
|
op_LNGFR uint32 = 0xB911 // FORMAT_RRE LOAD NEGATIVE (64<-32)
|
||
|
op_LNGR uint32 = 0xB901 // FORMAT_RRE LOAD NEGATIVE (64)
|
||
|
op_LNR uint32 = 0x1100 // FORMAT_RR LOAD NEGATIVE (32)
|
||
|
op_LNXBR uint32 = 0xB341 // FORMAT_RRE LOAD NEGATIVE (extended BFP)
|
||
|
op_LNXR uint32 = 0xB361 // FORMAT_RRE LOAD NEGATIVE (extended HFP)
|
||
|
op_LOC uint32 = 0xEBF2 // FORMAT_RSY2 LOAD ON CONDITION (32)
|
||
|
op_LOCG uint32 = 0xEBE2 // FORMAT_RSY2 LOAD ON CONDITION (64)
|
||
|
op_LOCGR uint32 = 0xB9E2 // FORMAT_RRF3 LOAD ON CONDITION (64)
|
||
|
op_LOCR uint32 = 0xB9F2 // FORMAT_RRF3 LOAD ON CONDITION (32)
|
||
|
op_LPD uint32 = 0xC804 // FORMAT_SSF LOAD PAIR DISJOINT (32)
|
||
|
op_LPDBR uint32 = 0xB310 // FORMAT_RRE LOAD POSITIVE (long BFP)
|
||
|
op_LPDFR uint32 = 0xB370 // FORMAT_RRE LOAD POSITIVE (long)
|
||
|
op_LPDG uint32 = 0xC805 // FORMAT_SSF LOAD PAIR DISJOINT (64)
|
||
|
op_LPDR uint32 = 0x2000 // FORMAT_RR LOAD POSITIVE (long HFP)
|
||
|
op_LPEBR uint32 = 0xB300 // FORMAT_RRE LOAD POSITIVE (short BFP)
|
||
|
op_LPER uint32 = 0x3000 // FORMAT_RR LOAD POSITIVE (short HFP)
|
||
|
op_LPGFR uint32 = 0xB910 // FORMAT_RRE LOAD POSITIVE (64<-32)
|
||
|
op_LPGR uint32 = 0xB900 // FORMAT_RRE LOAD POSITIVE (64)
|
||
|
op_LPQ uint32 = 0xE38F // FORMAT_RXY1 LOAD PAIR FROM QUADWORD
|
||
|
op_LPR uint32 = 0x1000 // FORMAT_RR LOAD POSITIVE (32)
|
||
|
op_LPSW uint32 = 0x8200 // FORMAT_S LOAD PSW
|
||
|
op_LPSWE uint32 = 0xB2B2 // FORMAT_S LOAD PSW EXTENDED
|
||
|
op_LPTEA uint32 = 0xB9AA // FORMAT_RRF2 LOAD PAGE TABLE ENTRY ADDRESS
|
||
|
op_LPXBR uint32 = 0xB340 // FORMAT_RRE LOAD POSITIVE (extended BFP)
|
||
|
op_LPXR uint32 = 0xB360 // FORMAT_RRE LOAD POSITIVE (extended HFP)
|
||
|
op_LR uint32 = 0x1800 // FORMAT_RR LOAD (32)
|
||
|
op_LRA uint32 = 0xB100 // FORMAT_RX1 LOAD REAL ADDRESS (32)
|
||
|
op_LRAG uint32 = 0xE303 // FORMAT_RXY1 LOAD REAL ADDRESS (64)
|
||
|
op_LRAY uint32 = 0xE313 // FORMAT_RXY1 LOAD REAL ADDRESS (32)
|
||
|
op_LRDR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
|
||
|
op_LRER uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
|
||
|
op_LRL uint32 = 0xC40D // FORMAT_RIL2 LOAD RELATIVE LONG (32)
|
||
|
op_LRV uint32 = 0xE31E // FORMAT_RXY1 LOAD REVERSED (32)
|
||
|
op_LRVG uint32 = 0xE30F // FORMAT_RXY1 LOAD REVERSED (64)
|
||
|
op_LRVGR uint32 = 0xB90F // FORMAT_RRE LOAD REVERSED (64)
|
||
|
op_LRVH uint32 = 0xE31F // FORMAT_RXY1 LOAD REVERSED (16)
|
||
|
op_LRVR uint32 = 0xB91F // FORMAT_RRE LOAD REVERSED (32)
|
||
|
op_LT uint32 = 0xE312 // FORMAT_RXY1 LOAD AND TEST (32)
|
||
|
op_LTDBR uint32 = 0xB312 // FORMAT_RRE LOAD AND TEST (long BFP)
|
||
|
op_LTDR uint32 = 0x2200 // FORMAT_RR LOAD AND TEST (long HFP)
|
||
|
op_LTDTR uint32 = 0xB3D6 // FORMAT_RRE LOAD AND TEST (long DFP)
|
||
|
op_LTEBR uint32 = 0xB302 // FORMAT_RRE LOAD AND TEST (short BFP)
|
||
|
op_LTER uint32 = 0x3200 // FORMAT_RR LOAD AND TEST (short HFP)
|
||
|
op_LTG uint32 = 0xE302 // FORMAT_RXY1 LOAD AND TEST (64)
|
||
|
op_LTGF uint32 = 0xE332 // FORMAT_RXY1 LOAD AND TEST (64<-32)
|
||
|
op_LTGFR uint32 = 0xB912 // FORMAT_RRE LOAD AND TEST (64<-32)
|
||
|
op_LTGR uint32 = 0xB902 // FORMAT_RRE LOAD AND TEST (64)
|
||
|
op_LTR uint32 = 0x1200 // FORMAT_RR LOAD AND TEST (32)
|
||
|
op_LTXBR uint32 = 0xB342 // FORMAT_RRE LOAD AND TEST (extended BFP)
|
||
|
op_LTXR uint32 = 0xB362 // FORMAT_RRE LOAD AND TEST (extended HFP)
|
||
|
op_LTXTR uint32 = 0xB3DE // FORMAT_RRE LOAD AND TEST (extended DFP)
|
||
|
op_LURA uint32 = 0xB24B // FORMAT_RRE LOAD USING REAL ADDRESS (32)
|
||
|
op_LURAG uint32 = 0xB905 // FORMAT_RRE LOAD USING REAL ADDRESS (64)
|
||
|
op_LXD uint32 = 0xED25 // FORMAT_RXE LOAD LENGTHENED (long to extended HFP)
|
||
|
op_LXDB uint32 = 0xED05 // FORMAT_RXE LOAD LENGTHENED (long to extended BFP)
|
||
|
op_LXDBR uint32 = 0xB305 // FORMAT_RRE LOAD LENGTHENED (long to extended BFP)
|
||
|
op_LXDR uint32 = 0xB325 // FORMAT_RRE LOAD LENGTHENED (long to extended HFP)
|
||
|
op_LXDTR uint32 = 0xB3DC // FORMAT_RRF4 LOAD LENGTHENED (long to extended DFP)
|
||
|
op_LXE uint32 = 0xED26 // FORMAT_RXE LOAD LENGTHENED (short to extended HFP)
|
||
|
op_LXEB uint32 = 0xED06 // FORMAT_RXE LOAD LENGTHENED (short to extended BFP)
|
||
|
op_LXEBR uint32 = 0xB306 // FORMAT_RRE LOAD LENGTHENED (short to extended BFP)
|
||
|
op_LXER uint32 = 0xB326 // FORMAT_RRE LOAD LENGTHENED (short to extended HFP)
|
||
|
op_LXR uint32 = 0xB365 // FORMAT_RRE LOAD (extended)
|
||
|
op_LY uint32 = 0xE358 // FORMAT_RXY1 LOAD (32)
|
||
|
op_LZDR uint32 = 0xB375 // FORMAT_RRE LOAD ZERO (long)
|
||
|
op_LZER uint32 = 0xB374 // FORMAT_RRE LOAD ZERO (short)
|
||
|
op_LZXR uint32 = 0xB376 // FORMAT_RRE LOAD ZERO (extended)
|
||
|
op_M uint32 = 0x5C00 // FORMAT_RX1 MULTIPLY (64<-32)
|
||
|
op_MAD uint32 = 0xED3E // FORMAT_RXF MULTIPLY AND ADD (long HFP)
|
||
|
op_MADB uint32 = 0xED1E // FORMAT_RXF MULTIPLY AND ADD (long BFP)
|
||
|
op_MADBR uint32 = 0xB31E // FORMAT_RRD MULTIPLY AND ADD (long BFP)
|
||
|
op_MADR uint32 = 0xB33E // FORMAT_RRD MULTIPLY AND ADD (long HFP)
|
||
|
op_MAE uint32 = 0xED2E // FORMAT_RXF MULTIPLY AND ADD (short HFP)
|
||
|
op_MAEB uint32 = 0xED0E // FORMAT_RXF MULTIPLY AND ADD (short BFP)
|
||
|
op_MAEBR uint32 = 0xB30E // FORMAT_RRD MULTIPLY AND ADD (short BFP)
|
||
|
op_MAER uint32 = 0xB32E // FORMAT_RRD MULTIPLY AND ADD (short HFP)
|
||
|
op_MAY uint32 = 0xED3A // FORMAT_RXF MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
|
||
|
op_MAYH uint32 = 0xED3C // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
|
||
|
op_MAYHR uint32 = 0xB33C // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
|
||
|
op_MAYL uint32 = 0xED38 // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
|
||
|
op_MAYLR uint32 = 0xB338 // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
|
||
|
op_MAYR uint32 = 0xB33A // FORMAT_RRD MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
|
||
|
op_MC uint32 = 0xAF00 // FORMAT_SI MONITOR CALL
|
||
|
op_MD uint32 = 0x6C00 // FORMAT_RX1 MULTIPLY (long HFP)
|
||
|
op_MDB uint32 = 0xED1C // FORMAT_RXE MULTIPLY (long BFP)
|
||
|
op_MDBR uint32 = 0xB31C // FORMAT_RRE MULTIPLY (long BFP)
|
||
|
op_MDE uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
|
||
|
op_MDEB uint32 = 0xED0C // FORMAT_RXE MULTIPLY (short to long BFP)
|
||
|
op_MDEBR uint32 = 0xB30C // FORMAT_RRE MULTIPLY (short to long BFP)
|
||
|
op_MDER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
|
||
|
op_MDR uint32 = 0x2C00 // FORMAT_RR MULTIPLY (long HFP)
|
||
|
op_MDTR uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
|
||
|
op_MDTRA uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
|
||
|
op_ME uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
|
||
|
op_MEE uint32 = 0xED37 // FORMAT_RXE MULTIPLY (short HFP)
|
||
|
op_MEEB uint32 = 0xED17 // FORMAT_RXE MULTIPLY (short BFP)
|
||
|
op_MEEBR uint32 = 0xB317 // FORMAT_RRE MULTIPLY (short BFP)
|
||
|
op_MEER uint32 = 0xB337 // FORMAT_RRE MULTIPLY (short HFP)
|
||
|
op_MER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
|
||
|
op_MFY uint32 = 0xE35C // FORMAT_RXY1 MULTIPLY (64<-32)
|
||
|
op_MGHI uint32 = 0xA70D // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (64)
|
||
|
op_MH uint32 = 0x4C00 // FORMAT_RX1 MULTIPLY HALFWORD (32)
|
||
|
op_MHI uint32 = 0xA70C // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (32)
|
||
|
op_MHY uint32 = 0xE37C // FORMAT_RXY1 MULTIPLY HALFWORD (32)
|
||
|
op_ML uint32 = 0xE396 // FORMAT_RXY1 MULTIPLY LOGICAL (64<-32)
|
||
|
op_MLG uint32 = 0xE386 // FORMAT_RXY1 MULTIPLY LOGICAL (128<-64)
|
||
|
op_MLGR uint32 = 0xB986 // FORMAT_RRE MULTIPLY LOGICAL (128<-64)
|
||
|
op_MLR uint32 = 0xB996 // FORMAT_RRE MULTIPLY LOGICAL (64<-32)
|
||
|
op_MP uint32 = 0xFC00 // FORMAT_SS2 MULTIPLY DECIMAL
|
||
|
op_MR uint32 = 0x1C00 // FORMAT_RR MULTIPLY (64<-32)
|
||
|
op_MS uint32 = 0x7100 // FORMAT_RX1 MULTIPLY SINGLE (32)
|
||
|
op_MSCH uint32 = 0xB232 // FORMAT_S MODIFY SUBCHANNEL
|
||
|
op_MSD uint32 = 0xED3F // FORMAT_RXF MULTIPLY AND SUBTRACT (long HFP)
|
||
|
op_MSDB uint32 = 0xED1F // FORMAT_RXF MULTIPLY AND SUBTRACT (long BFP)
|
||
|
op_MSDBR uint32 = 0xB31F // FORMAT_RRD MULTIPLY AND SUBTRACT (long BFP)
|
||
|
op_MSDR uint32 = 0xB33F // FORMAT_RRD MULTIPLY AND SUBTRACT (long HFP)
|
||
|
op_MSE uint32 = 0xED2F // FORMAT_RXF MULTIPLY AND SUBTRACT (short HFP)
|
||
|
op_MSEB uint32 = 0xED0F // FORMAT_RXF MULTIPLY AND SUBTRACT (short BFP)
|
||
|
op_MSEBR uint32 = 0xB30F // FORMAT_RRD MULTIPLY AND SUBTRACT (short BFP)
|
||
|
op_MSER uint32 = 0xB32F // FORMAT_RRD MULTIPLY AND SUBTRACT (short HFP)
|
||
|
op_MSFI uint32 = 0xC201 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (32)
|
||
|
op_MSG uint32 = 0xE30C // FORMAT_RXY1 MULTIPLY SINGLE (64)
|
||
|
op_MSGF uint32 = 0xE31C // FORMAT_RXY1 MULTIPLY SINGLE (64<-32)
|
||
|
op_MSGFI uint32 = 0xC200 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (64<-32)
|
||
|
op_MSGFR uint32 = 0xB91C // FORMAT_RRE MULTIPLY SINGLE (64<-32)
|
||
|
op_MSGR uint32 = 0xB90C // FORMAT_RRE MULTIPLY SINGLE (64)
|
||
|
op_MSR uint32 = 0xB252 // FORMAT_RRE MULTIPLY SINGLE (32)
|
||
|
op_MSTA uint32 = 0xB247 // FORMAT_RRE MODIFY STACKED STATE
|
||
|
op_MSY uint32 = 0xE351 // FORMAT_RXY1 MULTIPLY SINGLE (32)
|
||
|
op_MVC uint32 = 0xD200 // FORMAT_SS1 MOVE (character)
|
||
|
op_MVCDK uint32 = 0xE50F // FORMAT_SSE MOVE WITH DESTINATION KEY
|
||
|
op_MVCIN uint32 = 0xE800 // FORMAT_SS1 MOVE INVERSE
|
||
|
op_MVCK uint32 = 0xD900 // FORMAT_SS4 MOVE WITH KEY
|
||
|
op_MVCL uint32 = 0x0E00 // FORMAT_RR MOVE LONG
|
||
|
op_MVCLE uint32 = 0xA800 // FORMAT_RS1 MOVE LONG EXTENDED
|
||
|
op_MVCLU uint32 = 0xEB8E // FORMAT_RSY1 MOVE LONG UNICODE
|
||
|
op_MVCOS uint32 = 0xC800 // FORMAT_SSF MOVE WITH OPTIONAL SPECIFICATIONS
|
||
|
op_MVCP uint32 = 0xDA00 // FORMAT_SS4 MOVE TO PRIMARY
|
||
|
op_MVCS uint32 = 0xDB00 // FORMAT_SS4 MOVE TO SECONDARY
|
||
|
op_MVCSK uint32 = 0xE50E // FORMAT_SSE MOVE WITH SOURCE KEY
|
||
|
op_MVGHI uint32 = 0xE548 // FORMAT_SIL MOVE (64<-16)
|
||
|
op_MVHHI uint32 = 0xE544 // FORMAT_SIL MOVE (16<-16)
|
||
|
op_MVHI uint32 = 0xE54C // FORMAT_SIL MOVE (32<-16)
|
||
|
op_MVI uint32 = 0x9200 // FORMAT_SI MOVE (immediate)
|
||
|
op_MVIY uint32 = 0xEB52 // FORMAT_SIY MOVE (immediate)
|
||
|
op_MVN uint32 = 0xD100 // FORMAT_SS1 MOVE NUMERICS
|
||
|
op_MVO uint32 = 0xF100 // FORMAT_SS2 MOVE WITH OFFSET
|
||
|
op_MVPG uint32 = 0xB254 // FORMAT_RRE MOVE PAGE
|
||
|
op_MVST uint32 = 0xB255 // FORMAT_RRE MOVE STRING
|
||
|
op_MVZ uint32 = 0xD300 // FORMAT_SS1 MOVE ZONES
|
||
|
op_MXBR uint32 = 0xB34C // FORMAT_RRE MULTIPLY (extended BFP)
|
||
|
op_MXD uint32 = 0x6700 // FORMAT_RX1 MULTIPLY (long to extended HFP)
|
||
|
op_MXDB uint32 = 0xED07 // FORMAT_RXE MULTIPLY (long to extended BFP)
|
||
|
op_MXDBR uint32 = 0xB307 // FORMAT_RRE MULTIPLY (long to extended BFP)
|
||
|
op_MXDR uint32 = 0x2700 // FORMAT_RR MULTIPLY (long to extended HFP)
|
||
|
op_MXR uint32 = 0x2600 // FORMAT_RR MULTIPLY (extended HFP)
|
||
|
op_MXTR uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
|
||
|
op_MXTRA uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
|
||
|
op_MY uint32 = 0xED3B // FORMAT_RXF MULTIPLY UNNORMALIZED (long to ext. HFP)
|
||
|
op_MYH uint32 = 0xED3D // FORMAT_RXF MULTIPLY UNNORM. (long to ext. high HFP)
|
||
|
op_MYHR uint32 = 0xB33D // FORMAT_RRD MULTIPLY UNNORM. (long to ext. high HFP)
|
||
|
op_MYL uint32 = 0xED39 // FORMAT_RXF MULTIPLY UNNORM. (long to ext. low HFP)
|
||
|
op_MYLR uint32 = 0xB339 // FORMAT_RRD MULTIPLY UNNORM. (long to ext. low HFP)
|
||
|
op_MYR uint32 = 0xB33B // FORMAT_RRD MULTIPLY UNNORMALIZED (long to ext. HFP)
|
||
|
op_N uint32 = 0x5400 // FORMAT_RX1 AND (32)
|
||
|
op_NC uint32 = 0xD400 // FORMAT_SS1 AND (character)
|
||
|
op_NG uint32 = 0xE380 // FORMAT_RXY1 AND (64)
|
||
|
op_NGR uint32 = 0xB980 // FORMAT_RRE AND (64)
|
||
|
op_NGRK uint32 = 0xB9E4 // FORMAT_RRF1 AND (64)
|
||
|
op_NI uint32 = 0x9400 // FORMAT_SI AND (immediate)
|
||
|
op_NIAI uint32 = 0xB2FA // FORMAT_IE NEXT INSTRUCTION ACCESS INTENT
|
||
|
op_NIHF uint32 = 0xC00A // FORMAT_RIL1 AND IMMEDIATE (high)
|
||
|
op_NIHH uint32 = 0xA504 // FORMAT_RI1 AND IMMEDIATE (high high)
|
||
|
op_NIHL uint32 = 0xA505 // FORMAT_RI1 AND IMMEDIATE (high low)
|
||
|
op_NILF uint32 = 0xC00B // FORMAT_RIL1 AND IMMEDIATE (low)
|
||
|
op_NILH uint32 = 0xA506 // FORMAT_RI1 AND IMMEDIATE (low high)
|
||
|
op_NILL uint32 = 0xA507 // FORMAT_RI1 AND IMMEDIATE (low low)
|
||
|
op_NIY uint32 = 0xEB54 // FORMAT_SIY AND (immediate)
|
||
|
op_NR uint32 = 0x1400 // FORMAT_RR AND (32)
|
||
|
op_NRK uint32 = 0xB9F4 // FORMAT_RRF1 AND (32)
|
||
|
op_NTSTG uint32 = 0xE325 // FORMAT_RXY1 NONTRANSACTIONAL STORE
|
||
|
op_NY uint32 = 0xE354 // FORMAT_RXY1 AND (32)
|
||
|
op_O uint32 = 0x5600 // FORMAT_RX1 OR (32)
|
||
|
op_OC uint32 = 0xD600 // FORMAT_SS1 OR (character)
|
||
|
op_OG uint32 = 0xE381 // FORMAT_RXY1 OR (64)
|
||
|
op_OGR uint32 = 0xB981 // FORMAT_RRE OR (64)
|
||
|
op_OGRK uint32 = 0xB9E6 // FORMAT_RRF1 OR (64)
|
||
|
op_OI uint32 = 0x9600 // FORMAT_SI OR (immediate)
|
||
|
op_OIHF uint32 = 0xC00C // FORMAT_RIL1 OR IMMEDIATE (high)
|
||
|
op_OIHH uint32 = 0xA508 // FORMAT_RI1 OR IMMEDIATE (high high)
|
||
|
op_OIHL uint32 = 0xA509 // FORMAT_RI1 OR IMMEDIATE (high low)
|
||
|
op_OILF uint32 = 0xC00D // FORMAT_RIL1 OR IMMEDIATE (low)
|
||
|
op_OILH uint32 = 0xA50A // FORMAT_RI1 OR IMMEDIATE (low high)
|
||
|
op_OILL uint32 = 0xA50B // FORMAT_RI1 OR IMMEDIATE (low low)
|
||
|
op_OIY uint32 = 0xEB56 // FORMAT_SIY OR (immediate)
|
||
|
op_OR uint32 = 0x1600 // FORMAT_RR OR (32)
|
||
|
op_ORK uint32 = 0xB9F6 // FORMAT_RRF1 OR (32)
|
||
|
op_OY uint32 = 0xE356 // FORMAT_RXY1 OR (32)
|
||
|
op_PACK uint32 = 0xF200 // FORMAT_SS2 PACK
|
||
|
op_PALB uint32 = 0xB248 // FORMAT_RRE PURGE ALB
|
||
|
op_PC uint32 = 0xB218 // FORMAT_S PROGRAM CALL
|
||
|
op_PCC uint32 = 0xB92C // FORMAT_RRE PERFORM CRYPTOGRAPHIC COMPUTATION
|
||
|
op_PCKMO uint32 = 0xB928 // FORMAT_RRE PERFORM CRYPTOGRAPHIC KEY MGMT. OPERATIONS
|
||
|
op_PFD uint32 = 0xE336 // FORMAT_RXY2 PREFETCH DATA
|
||
|
op_PFDRL uint32 = 0xC602 // FORMAT_RIL3 PREFETCH DATA RELATIVE LONG
|
||
|
op_PFMF uint32 = 0xB9AF // FORMAT_RRE PERFORM FRAME MANAGEMENT FUNCTION
|
||
|
op_PFPO uint32 = 0x010A // FORMAT_E PERFORM FLOATING-POINT OPERATION
|
||
|
op_PGIN uint32 = 0xB22E // FORMAT_RRE PAGE IN
|
||
|
op_PGOUT uint32 = 0xB22F // FORMAT_RRE PAGE OUT
|
||
|
op_PKA uint32 = 0xE900 // FORMAT_SS6 PACK ASCII
|
||
|
op_PKU uint32 = 0xE100 // FORMAT_SS6 PACK UNICODE
|
||
|
op_PLO uint32 = 0xEE00 // FORMAT_SS5 PERFORM LOCKED OPERATION
|
||
|
op_POPCNT uint32 = 0xB9E1 // FORMAT_RRE POPULATION COUNT
|
||
|
op_PPA uint32 = 0xB2E8 // FORMAT_RRF3 PERFORM PROCESSOR ASSIST
|
||
|
op_PR uint32 = 0x0101 // FORMAT_E PROGRAM RETURN
|
||
|
op_PT uint32 = 0xB228 // FORMAT_RRE PROGRAM TRANSFER
|
||
|
op_PTF uint32 = 0xB9A2 // FORMAT_RRE PERFORM TOPOLOGY FUNCTION
|
||
|
op_PTFF uint32 = 0x0104 // FORMAT_E PERFORM TIMING FACILITY FUNCTION
|
||
|
op_PTI uint32 = 0xB99E // FORMAT_RRE PROGRAM TRANSFER WITH INSTANCE
|
||
|
op_PTLB uint32 = 0xB20D // FORMAT_S PURGE TLB
|
||
|
op_QADTR uint32 = 0xB3F5 // FORMAT_RRF2 QUANTIZE (long DFP)
|
||
|
op_QAXTR uint32 = 0xB3FD // FORMAT_RRF2 QUANTIZE (extended DFP)
|
||
|
op_RCHP uint32 = 0xB23B // FORMAT_S RESET CHANNEL PATH
|
||
|
op_RISBG uint32 = 0xEC55 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
|
||
|
op_RISBGN uint32 = 0xEC59 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
|
||
|
op_RISBHG uint32 = 0xEC5D // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS HIGH
|
||
|
op_RISBLG uint32 = 0xEC51 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS LOW
|
||
|
op_RLL uint32 = 0xEB1D // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (32)
|
||
|
op_RLLG uint32 = 0xEB1C // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (64)
|
||
|
op_RNSBG uint32 = 0xEC54 // FORMAT_RIE6 ROTATE THEN AND SELECTED BITS
|
||
|
op_ROSBG uint32 = 0xEC56 // FORMAT_RIE6 ROTATE THEN OR SELECTED BITS
|
||
|
op_RP uint32 = 0xB277 // FORMAT_S RESUME PROGRAM
|
||
|
op_RRBE uint32 = 0xB22A // FORMAT_RRE RESET REFERENCE BIT EXTENDED
|
||
|
op_RRBM uint32 = 0xB9AE // FORMAT_RRE RESET REFERENCE BITS MULTIPLE
|
||
|
op_RRDTR uint32 = 0xB3F7 // FORMAT_RRF2 REROUND (long DFP)
|
||
|
op_RRXTR uint32 = 0xB3FF // FORMAT_RRF2 REROUND (extended DFP)
|
||
|
op_RSCH uint32 = 0xB238 // FORMAT_S RESUME SUBCHANNEL
|
||
|
op_RXSBG uint32 = 0xEC57 // FORMAT_RIE6 ROTATE THEN EXCLUSIVE OR SELECTED BITS
|
||
|
op_S uint32 = 0x5B00 // FORMAT_RX1 SUBTRACT (32)
|
||
|
op_SAC uint32 = 0xB219 // FORMAT_S SET ADDRESS SPACE CONTROL
|
||
|
op_SACF uint32 = 0xB279 // FORMAT_S SET ADDRESS SPACE CONTROL FAST
|
||
|
op_SAL uint32 = 0xB237 // FORMAT_S SET ADDRESS LIMIT
|
||
|
op_SAM24 uint32 = 0x010C // FORMAT_E SET ADDRESSING MODE (24)
|
||
|
op_SAM31 uint32 = 0x010D // FORMAT_E SET ADDRESSING MODE (31)
|
||
|
op_SAM64 uint32 = 0x010E // FORMAT_E SET ADDRESSING MODE (64)
|
||
|
op_SAR uint32 = 0xB24E // FORMAT_RRE SET ACCESS
|
||
|
op_SCHM uint32 = 0xB23C // FORMAT_S SET CHANNEL MONITOR
|
||
|
op_SCK uint32 = 0xB204 // FORMAT_S SET CLOCK
|
||
|
op_SCKC uint32 = 0xB206 // FORMAT_S SET CLOCK COMPARATOR
|
||
|
op_SCKPF uint32 = 0x0107 // FORMAT_E SET CLOCK PROGRAMMABLE FIELD
|
||
|
op_SD uint32 = 0x6B00 // FORMAT_RX1 SUBTRACT NORMALIZED (long HFP)
|
||
|
op_SDB uint32 = 0xED1B // FORMAT_RXE SUBTRACT (long BFP)
|
||
|
op_SDBR uint32 = 0xB31B // FORMAT_RRE SUBTRACT (long BFP)
|
||
|
op_SDR uint32 = 0x2B00 // FORMAT_RR SUBTRACT NORMALIZED (long HFP)
|
||
|
op_SDTR uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
|
||
|
op_SDTRA uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
|
||
|
op_SE uint32 = 0x7B00 // FORMAT_RX1 SUBTRACT NORMALIZED (short HFP)
|
||
|
op_SEB uint32 = 0xED0B // FORMAT_RXE SUBTRACT (short BFP)
|
||
|
op_SEBR uint32 = 0xB30B // FORMAT_RRE SUBTRACT (short BFP)
|
||
|
op_SER uint32 = 0x3B00 // FORMAT_RR SUBTRACT NORMALIZED (short HFP)
|
||
|
op_SFASR uint32 = 0xB385 // FORMAT_RRE SET FPC AND SIGNAL
|
||
|
op_SFPC uint32 = 0xB384 // FORMAT_RRE SET FPC
|
||
|
op_SG uint32 = 0xE309 // FORMAT_RXY1 SUBTRACT (64)
|
||
|
op_SGF uint32 = 0xE319 // FORMAT_RXY1 SUBTRACT (64<-32)
|
||
|
op_SGFR uint32 = 0xB919 // FORMAT_RRE SUBTRACT (64<-32)
|
||
|
op_SGR uint32 = 0xB909 // FORMAT_RRE SUBTRACT (64)
|
||
|
op_SGRK uint32 = 0xB9E9 // FORMAT_RRF1 SUBTRACT (64)
|
||
|
op_SH uint32 = 0x4B00 // FORMAT_RX1 SUBTRACT HALFWORD
|
||
|
op_SHHHR uint32 = 0xB9C9 // FORMAT_RRF1 SUBTRACT HIGH (32)
|
||
|
op_SHHLR uint32 = 0xB9D9 // FORMAT_RRF1 SUBTRACT HIGH (32)
|
||
|
op_SHY uint32 = 0xE37B // FORMAT_RXY1 SUBTRACT HALFWORD
|
||
|
op_SIGP uint32 = 0xAE00 // FORMAT_RS1 SIGNAL PROCESSOR
|
||
|
op_SL uint32 = 0x5F00 // FORMAT_RX1 SUBTRACT LOGICAL (32)
|
||
|
op_SLA uint32 = 0x8B00 // FORMAT_RS1 SHIFT LEFT SINGLE (32)
|
||
|
op_SLAG uint32 = 0xEB0B // FORMAT_RSY1 SHIFT LEFT SINGLE (64)
|
||
|
op_SLAK uint32 = 0xEBDD // FORMAT_RSY1 SHIFT LEFT SINGLE (32)
|
||
|
op_SLB uint32 = 0xE399 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (32)
|
||
|
op_SLBG uint32 = 0xE389 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (64)
|
||
|
op_SLBGR uint32 = 0xB989 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (64)
|
||
|
op_SLBR uint32 = 0xB999 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (32)
|
||
|
op_SLDA uint32 = 0x8F00 // FORMAT_RS1 SHIFT LEFT DOUBLE
|
||
|
op_SLDL uint32 = 0x8D00 // FORMAT_RS1 SHIFT LEFT DOUBLE LOGICAL
|
||
|
op_SLDT uint32 = 0xED40 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (long DFP)
|
||
|
op_SLFI uint32 = 0xC205 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (32)
|
||
|
op_SLG uint32 = 0xE30B // FORMAT_RXY1 SUBTRACT LOGICAL (64)
|
||
|
op_SLGF uint32 = 0xE31B // FORMAT_RXY1 SUBTRACT LOGICAL (64<-32)
|
||
|
op_SLGFI uint32 = 0xC204 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (64<-32)
|
||
|
op_SLGFR uint32 = 0xB91B // FORMAT_RRE SUBTRACT LOGICAL (64<-32)
|
||
|
op_SLGR uint32 = 0xB90B // FORMAT_RRE SUBTRACT LOGICAL (64)
|
||
|
op_SLGRK uint32 = 0xB9EB // FORMAT_RRF1 SUBTRACT LOGICAL (64)
|
||
|
op_SLHHHR uint32 = 0xB9CB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
|
||
|
op_SLHHLR uint32 = 0xB9DB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
|
||
|
op_SLL uint32 = 0x8900 // FORMAT_RS1 SHIFT LEFT SINGLE LOGICAL (32)
|
||
|
op_SLLG uint32 = 0xEB0D // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (64)
|
||
|
op_SLLK uint32 = 0xEBDF // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (32)
|
||
|
op_SLR uint32 = 0x1F00 // FORMAT_RR SUBTRACT LOGICAL (32)
|
||
|
op_SLRK uint32 = 0xB9FB // FORMAT_RRF1 SUBTRACT LOGICAL (32)
|
||
|
op_SLXT uint32 = 0xED48 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (extended DFP)
|
||
|
op_SLY uint32 = 0xE35F // FORMAT_RXY1 SUBTRACT LOGICAL (32)
|
||
|
op_SP uint32 = 0xFB00 // FORMAT_SS2 SUBTRACT DECIMAL
|
||
|
op_SPKA uint32 = 0xB20A // FORMAT_S SET PSW KEY FROM ADDRESS
|
||
|
op_SPM uint32 = 0x0400 // FORMAT_RR SET PROGRAM MASK
|
||
|
op_SPT uint32 = 0xB208 // FORMAT_S SET CPU TIMER
|
||
|
op_SPX uint32 = 0xB210 // FORMAT_S SET PREFIX
|
||
|
op_SQD uint32 = 0xED35 // FORMAT_RXE SQUARE ROOT (long HFP)
|
||
|
op_SQDB uint32 = 0xED15 // FORMAT_RXE SQUARE ROOT (long BFP)
|
||
|
op_SQDBR uint32 = 0xB315 // FORMAT_RRE SQUARE ROOT (long BFP)
|
||
|
op_SQDR uint32 = 0xB244 // FORMAT_RRE SQUARE ROOT (long HFP)
|
||
|
op_SQE uint32 = 0xED34 // FORMAT_RXE SQUARE ROOT (short HFP)
|
||
|
op_SQEB uint32 = 0xED14 // FORMAT_RXE SQUARE ROOT (short BFP)
|
||
|
op_SQEBR uint32 = 0xB314 // FORMAT_RRE SQUARE ROOT (short BFP)
|
||
|
op_SQER uint32 = 0xB245 // FORMAT_RRE SQUARE ROOT (short HFP)
|
||
|
op_SQXBR uint32 = 0xB316 // FORMAT_RRE SQUARE ROOT (extended BFP)
|
||
|
op_SQXR uint32 = 0xB336 // FORMAT_RRE SQUARE ROOT (extended HFP)
|
||
|
op_SR uint32 = 0x1B00 // FORMAT_RR SUBTRACT (32)
|
||
|
op_SRA uint32 = 0x8A00 // FORMAT_RS1 SHIFT RIGHT SINGLE (32)
|
||
|
op_SRAG uint32 = 0xEB0A // FORMAT_RSY1 SHIFT RIGHT SINGLE (64)
|
||
|
op_SRAK uint32 = 0xEBDC // FORMAT_RSY1 SHIFT RIGHT SINGLE (32)
|
||
|
op_SRDA uint32 = 0x8E00 // FORMAT_RS1 SHIFT RIGHT DOUBLE
|
||
|
op_SRDL uint32 = 0x8C00 // FORMAT_RS1 SHIFT RIGHT DOUBLE LOGICAL
|
||
|
op_SRDT uint32 = 0xED41 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (long DFP)
|
||
|
op_SRK uint32 = 0xB9F9 // FORMAT_RRF1 SUBTRACT (32)
|
||
|
op_SRL uint32 = 0x8800 // FORMAT_RS1 SHIFT RIGHT SINGLE LOGICAL (32)
|
||
|
op_SRLG uint32 = 0xEB0C // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (64)
|
||
|
op_SRLK uint32 = 0xEBDE // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (32)
|
||
|
op_SRNM uint32 = 0xB299 // FORMAT_S SET BFP ROUNDING MODE (2 bit)
|
||
|
op_SRNMB uint32 = 0xB2B8 // FORMAT_S SET BFP ROUNDING MODE (3 bit)
|
||
|
op_SRNMT uint32 = 0xB2B9 // FORMAT_S SET DFP ROUNDING MODE
|
||
|
op_SRP uint32 = 0xF000 // FORMAT_SS3 SHIFT AND ROUND DECIMAL
|
||
|
op_SRST uint32 = 0xB25E // FORMAT_RRE SEARCH STRING
|
||
|
op_SRSTU uint32 = 0xB9BE // FORMAT_RRE SEARCH STRING UNICODE
|
||
|
op_SRXT uint32 = 0xED49 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (extended DFP)
|
||
|
op_SSAIR uint32 = 0xB99F // FORMAT_RRE SET SECONDARY ASN WITH INSTANCE
|
||
|
op_SSAR uint32 = 0xB225 // FORMAT_RRE SET SECONDARY ASN
|
||
|
op_SSCH uint32 = 0xB233 // FORMAT_S START SUBCHANNEL
|
||
|
op_SSKE uint32 = 0xB22B // FORMAT_RRF3 SET STORAGE KEY EXTENDED
|
||
|
op_SSM uint32 = 0x8000 // FORMAT_S SET SYSTEM MASK
|
||
|
op_ST uint32 = 0x5000 // FORMAT_RX1 STORE (32)
|
||
|
op_STAM uint32 = 0x9B00 // FORMAT_RS1 STORE ACCESS MULTIPLE
|
||
|
op_STAMY uint32 = 0xEB9B // FORMAT_RSY1 STORE ACCESS MULTIPLE
|
||
|
op_STAP uint32 = 0xB212 // FORMAT_S STORE CPU ADDRESS
|
||
|
op_STC uint32 = 0x4200 // FORMAT_RX1 STORE CHARACTER
|
||
|
op_STCH uint32 = 0xE3C3 // FORMAT_RXY1 STORE CHARACTER HIGH (8)
|
||
|
op_STCK uint32 = 0xB205 // FORMAT_S STORE CLOCK
|
||
|
op_STCKC uint32 = 0xB207 // FORMAT_S STORE CLOCK COMPARATOR
|
||
|
op_STCKE uint32 = 0xB278 // FORMAT_S STORE CLOCK EXTENDED
|
||
|
op_STCKF uint32 = 0xB27C // FORMAT_S STORE CLOCK FAST
|
||
|
op_STCM uint32 = 0xBE00 // FORMAT_RS2 STORE CHARACTERS UNDER MASK (low)
|
||
|
op_STCMH uint32 = 0xEB2C // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (high)
|
||
|
op_STCMY uint32 = 0xEB2D // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (low)
|
||
|
op_STCPS uint32 = 0xB23A // FORMAT_S STORE CHANNEL PATH STATUS
|
||
|
op_STCRW uint32 = 0xB239 // FORMAT_S STORE CHANNEL REPORT WORD
|
||
|
op_STCTG uint32 = 0xEB25 // FORMAT_RSY1 STORE CONTROL (64)
|
||
|
op_STCTL uint32 = 0xB600 // FORMAT_RS1 STORE CONTROL (32)
|
||
|
op_STCY uint32 = 0xE372 // FORMAT_RXY1 STORE CHARACTER
|
||
|
op_STD uint32 = 0x6000 // FORMAT_RX1 STORE (long)
|
||
|
op_STDY uint32 = 0xED67 // FORMAT_RXY1 STORE (long)
|
||
|
op_STE uint32 = 0x7000 // FORMAT_RX1 STORE (short)
|
||
|
op_STEY uint32 = 0xED66 // FORMAT_RXY1 STORE (short)
|
||
|
op_STFH uint32 = 0xE3CB // FORMAT_RXY1 STORE HIGH (32)
|
||
|
op_STFL uint32 = 0xB2B1 // FORMAT_S STORE FACILITY LIST
|
||
|
op_STFLE uint32 = 0xB2B0 // FORMAT_S STORE FACILITY LIST EXTENDED
|
||
|
op_STFPC uint32 = 0xB29C // FORMAT_S STORE FPC
|
||
|
op_STG uint32 = 0xE324 // FORMAT_RXY1 STORE (64)
|
||
|
op_STGRL uint32 = 0xC40B // FORMAT_RIL2 STORE RELATIVE LONG (64)
|
||
|
op_STH uint32 = 0x4000 // FORMAT_RX1 STORE HALFWORD
|
||
|
op_STHH uint32 = 0xE3C7 // FORMAT_RXY1 STORE HALFWORD HIGH (16)
|
||
|
op_STHRL uint32 = 0xC407 // FORMAT_RIL2 STORE HALFWORD RELATIVE LONG
|
||
|
op_STHY uint32 = 0xE370 // FORMAT_RXY1 STORE HALFWORD
|
||
|
op_STIDP uint32 = 0xB202 // FORMAT_S STORE CPU ID
|
||
|
op_STM uint32 = 0x9000 // FORMAT_RS1 STORE MULTIPLE (32)
|
||
|
op_STMG uint32 = 0xEB24 // FORMAT_RSY1 STORE MULTIPLE (64)
|
||
|
op_STMH uint32 = 0xEB26 // FORMAT_RSY1 STORE MULTIPLE HIGH
|
||
|
op_STMY uint32 = 0xEB90 // FORMAT_RSY1 STORE MULTIPLE (32)
|
||
|
op_STNSM uint32 = 0xAC00 // FORMAT_SI STORE THEN AND SYSTEM MASK
|
||
|
op_STOC uint32 = 0xEBF3 // FORMAT_RSY2 STORE ON CONDITION (32)
|
||
|
op_STOCG uint32 = 0xEBE3 // FORMAT_RSY2 STORE ON CONDITION (64)
|
||
|
op_STOSM uint32 = 0xAD00 // FORMAT_SI STORE THEN OR SYSTEM MASK
|
||
|
op_STPQ uint32 = 0xE38E // FORMAT_RXY1 STORE PAIR TO QUADWORD
|
||
|
op_STPT uint32 = 0xB209 // FORMAT_S STORE CPU TIMER
|
||
|
op_STPX uint32 = 0xB211 // FORMAT_S STORE PREFIX
|
||
|
op_STRAG uint32 = 0xE502 // FORMAT_SSE STORE REAL ADDRESS
|
||
|
op_STRL uint32 = 0xC40F // FORMAT_RIL2 STORE RELATIVE LONG (32)
|
||
|
op_STRV uint32 = 0xE33E // FORMAT_RXY1 STORE REVERSED (32)
|
||
|
op_STRVG uint32 = 0xE32F // FORMAT_RXY1 STORE REVERSED (64)
|
||
|
op_STRVH uint32 = 0xE33F // FORMAT_RXY1 STORE REVERSED (16)
|
||
|
op_STSCH uint32 = 0xB234 // FORMAT_S STORE SUBCHANNEL
|
||
|
op_STSI uint32 = 0xB27D // FORMAT_S STORE SYSTEM INFORMATION
|
||
|
op_STURA uint32 = 0xB246 // FORMAT_RRE STORE USING REAL ADDRESS (32)
|
||
|
op_STURG uint32 = 0xB925 // FORMAT_RRE STORE USING REAL ADDRESS (64)
|
||
|
op_STY uint32 = 0xE350 // FORMAT_RXY1 STORE (32)
|
||
|
op_SU uint32 = 0x7F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (short HFP)
|
||
|
op_SUR uint32 = 0x3F00 // FORMAT_RR SUBTRACT UNNORMALIZED (short HFP)
|
||
|
op_SVC uint32 = 0x0A00 // FORMAT_I SUPERVISOR CALL
|
||
|
op_SW uint32 = 0x6F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (long HFP)
|
||
|
op_SWR uint32 = 0x2F00 // FORMAT_RR SUBTRACT UNNORMALIZED (long HFP)
|
||
|
op_SXBR uint32 = 0xB34B // FORMAT_RRE SUBTRACT (extended BFP)
|
||
|
op_SXR uint32 = 0x3700 // FORMAT_RR SUBTRACT NORMALIZED (extended HFP)
|
||
|
op_SXTR uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
|
||
|
op_SXTRA uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
|
||
|
op_SY uint32 = 0xE35B // FORMAT_RXY1 SUBTRACT (32)
|
||
|
op_TABORT uint32 = 0xB2FC // FORMAT_S TRANSACTION ABORT
|
||
|
op_TAM uint32 = 0x010B // FORMAT_E TEST ADDRESSING MODE
|
||
|
op_TAR uint32 = 0xB24C // FORMAT_RRE TEST ACCESS
|
||
|
op_TB uint32 = 0xB22C // FORMAT_RRE TEST BLOCK
|
||
|
op_TBDR uint32 = 0xB351 // FORMAT_RRF5 CONVERT HFP TO BFP (long)
|
||
|
op_TBEDR uint32 = 0xB350 // FORMAT_RRF5 CONVERT HFP TO BFP (long to short)
|
||
|
op_TBEGIN uint32 = 0xE560 // FORMAT_SIL TRANSACTION BEGIN
|
||
|
op_TBEGINC uint32 = 0xE561 // FORMAT_SIL TRANSACTION BEGIN
|
||
|
op_TCDB uint32 = 0xED11 // FORMAT_RXE TEST DATA CLASS (long BFP)
|
||
|
op_TCEB uint32 = 0xED10 // FORMAT_RXE TEST DATA CLASS (short BFP)
|
||
|
op_TCXB uint32 = 0xED12 // FORMAT_RXE TEST DATA CLASS (extended BFP)
|
||
|
op_TDCDT uint32 = 0xED54 // FORMAT_RXE TEST DATA CLASS (long DFP)
|
||
|
op_TDCET uint32 = 0xED50 // FORMAT_RXE TEST DATA CLASS (short DFP)
|
||
|
op_TDCXT uint32 = 0xED58 // FORMAT_RXE TEST DATA CLASS (extended DFP)
|
||
|
op_TDGDT uint32 = 0xED55 // FORMAT_RXE TEST DATA GROUP (long DFP)
|
||
|
op_TDGET uint32 = 0xED51 // FORMAT_RXE TEST DATA GROUP (short DFP)
|
||
|
op_TDGXT uint32 = 0xED59 // FORMAT_RXE TEST DATA GROUP (extended DFP)
|
||
|
op_TEND uint32 = 0xB2F8 // FORMAT_S TRANSACTION END
|
||
|
op_THDER uint32 = 0xB358 // FORMAT_RRE CONVERT BFP TO HFP (short to long)
|
||
|
op_THDR uint32 = 0xB359 // FORMAT_RRE CONVERT BFP TO HFP (long)
|
||
|
op_TM uint32 = 0x9100 // FORMAT_SI TEST UNDER MASK
|
||
|
op_TMH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK HIGH
|
||
|
op_TMHH uint32 = 0xA702 // FORMAT_RI1 TEST UNDER MASK (high high)
|
||
|
op_TMHL uint32 = 0xA703 // FORMAT_RI1 TEST UNDER MASK (high low)
|
||
|
op_TML uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK LOW
|
||
|
op_TMLH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK (low high)
|
||
|
op_TMLL uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK (low low)
|
||
|
op_TMY uint32 = 0xEB51 // FORMAT_SIY TEST UNDER MASK
|
||
|
op_TP uint32 = 0xEBC0 // FORMAT_RSL TEST DECIMAL
|
||
|
op_TPI uint32 = 0xB236 // FORMAT_S TEST PENDING INTERRUPTION
|
||
|
op_TPROT uint32 = 0xE501 // FORMAT_SSE TEST PROTECTION
|
||
|
op_TR uint32 = 0xDC00 // FORMAT_SS1 TRANSLATE
|
||
|
op_TRACE uint32 = 0x9900 // FORMAT_RS1 TRACE (32)
|
||
|
op_TRACG uint32 = 0xEB0F // FORMAT_RSY1 TRACE (64)
|
||
|
op_TRAP2 uint32 = 0x01FF // FORMAT_E TRAP
|
||
|
op_TRAP4 uint32 = 0xB2FF // FORMAT_S TRAP
|
||
|
op_TRE uint32 = 0xB2A5 // FORMAT_RRE TRANSLATE EXTENDED
|
||
|
op_TROO uint32 = 0xB993 // FORMAT_RRF3 TRANSLATE ONE TO ONE
|
||
|
op_TROT uint32 = 0xB992 // FORMAT_RRF3 TRANSLATE ONE TO TWO
|
||
|
op_TRT uint32 = 0xDD00 // FORMAT_SS1 TRANSLATE AND TEST
|
||
|
op_TRTE uint32 = 0xB9BF // FORMAT_RRF3 TRANSLATE AND TEST EXTENDED
|
||
|
op_TRTO uint32 = 0xB991 // FORMAT_RRF3 TRANSLATE TWO TO ONE
|
||
|
op_TRTR uint32 = 0xD000 // FORMAT_SS1 TRANSLATE AND TEST REVERSE
|
||
|
op_TRTRE uint32 = 0xB9BD // FORMAT_RRF3 TRANSLATE AND TEST REVERSE EXTENDED
|
||
|
op_TRTT uint32 = 0xB990 // FORMAT_RRF3 TRANSLATE TWO TO TWO
|
||
|
op_TS uint32 = 0x9300 // FORMAT_S TEST AND SET
|
||
|
op_TSCH uint32 = 0xB235 // FORMAT_S TEST SUBCHANNEL
|
||
|
op_UNPK uint32 = 0xF300 // FORMAT_SS2 UNPACK
|
||
|
op_UNPKA uint32 = 0xEA00 // FORMAT_SS1 UNPACK ASCII
|
||
|
op_UNPKU uint32 = 0xE200 // FORMAT_SS1 UNPACK UNICODE
|
||
|
op_UPT uint32 = 0x0102 // FORMAT_E UPDATE TREE
|
||
|
op_X uint32 = 0x5700 // FORMAT_RX1 EXCLUSIVE OR (32)
|
||
|
op_XC uint32 = 0xD700 // FORMAT_SS1 EXCLUSIVE OR (character)
|
||
|
op_XG uint32 = 0xE382 // FORMAT_RXY1 EXCLUSIVE OR (64)
|
||
|
op_XGR uint32 = 0xB982 // FORMAT_RRE EXCLUSIVE OR (64)
|
||
|
op_XGRK uint32 = 0xB9E7 // FORMAT_RRF1 EXCLUSIVE OR (64)
|
||
|
op_XI uint32 = 0x9700 // FORMAT_SI EXCLUSIVE OR (immediate)
|
||
|
op_XIHF uint32 = 0xC006 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (high)
|
||
|
op_XILF uint32 = 0xC007 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (low)
|
||
|
op_XIY uint32 = 0xEB57 // FORMAT_SIY EXCLUSIVE OR (immediate)
|
||
|
op_XR uint32 = 0x1700 // FORMAT_RR EXCLUSIVE OR (32)
|
||
|
op_XRK uint32 = 0xB9F7 // FORMAT_RRF1 EXCLUSIVE OR (32)
|
||
|
op_XSCH uint32 = 0xB276 // FORMAT_S CANCEL SUBCHANNEL
|
||
|
op_XY uint32 = 0xE357 // FORMAT_RXY1 EXCLUSIVE OR (32)
|
||
|
op_ZAP uint32 = 0xF800 // FORMAT_SS2 ZERO AND ADD
|
||
|
|
||
|
// added in z13
|
||
|
op_CXPT uint32 = 0xEDAF // RSL-b CONVERT FROM PACKED (to extended DFP)
|
||
|
op_CDPT uint32 = 0xEDAE // RSL-b CONVERT FROM PACKED (to long DFP)
|
||
|
op_CPXT uint32 = 0xEDAD // RSL-b CONVERT TO PACKED (from extended DFP)
|
||
|
op_CPDT uint32 = 0xEDAC // RSL-b CONVERT TO PACKED (from long DFP)
|
||
|
op_LZRF uint32 = 0xE33B // RXY-a LOAD AND ZERO RIGHTMOST BYTE (32)
|
||
|
op_LZRG uint32 = 0xE32A // RXY-a LOAD AND ZERO RIGHTMOST BYTE (64)
|
||
|
op_LCCB uint32 = 0xE727 // RXE LOAD COUNT TO BLOCK BOUNDARY
|
||
|
op_LOCHHI uint32 = 0xEC4E // RIE-g LOAD HALFWORD HIGH IMMEDIATE ON CONDITION (32←16)
|
||
|
op_LOCHI uint32 = 0xEC42 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (32←16)
|
||
|
op_LOCGHI uint32 = 0xEC46 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (64←16)
|
||
|
op_LOCFH uint32 = 0xEBE0 // RSY-b LOAD HIGH ON CONDITION (32)
|
||
|
op_LOCFHR uint32 = 0xB9E0 // RRF-c LOAD HIGH ON CONDITION (32)
|
||
|
op_LLZRGF uint32 = 0xE33A // RXY-a LOAD LOGICAL AND ZERO RIGHTMOST BYTE (64←32)
|
||
|
op_STOCFH uint32 = 0xEBE1 // RSY-b STORE HIGH ON CONDITION
|
||
|
op_VA uint32 = 0xE7F3 // VRR-c VECTOR ADD
|
||
|
op_VACC uint32 = 0xE7F1 // VRR-c VECTOR ADD COMPUTE CARRY
|
||
|
op_VAC uint32 = 0xE7BB // VRR-d VECTOR ADD WITH CARRY
|
||
|
op_VACCC uint32 = 0xE7B9 // VRR-d VECTOR ADD WITH CARRY COMPUTE CARRY
|
||
|
op_VN uint32 = 0xE768 // VRR-c VECTOR AND
|
||
|
op_VNC uint32 = 0xE769 // VRR-c VECTOR AND WITH COMPLEMENT
|
||
|
op_VAVG uint32 = 0xE7F2 // VRR-c VECTOR AVERAGE
|
||
|
op_VAVGL uint32 = 0xE7F0 // VRR-c VECTOR AVERAGE LOGICAL
|
||
|
op_VCKSM uint32 = 0xE766 // VRR-c VECTOR CHECKSUM
|
||
|
op_VCEQ uint32 = 0xE7F8 // VRR-b VECTOR COMPARE EQUAL
|
||
|
op_VCH uint32 = 0xE7FB // VRR-b VECTOR COMPARE HIGH
|
||
|
op_VCHL uint32 = 0xE7F9 // VRR-b VECTOR COMPARE HIGH LOGICAL
|
||
|
op_VCLZ uint32 = 0xE753 // VRR-a VECTOR COUNT LEADING ZEROS
|
||
|
op_VCTZ uint32 = 0xE752 // VRR-a VECTOR COUNT TRAILING ZEROS
|
||
|
op_VEC uint32 = 0xE7DB // VRR-a VECTOR ELEMENT COMPARE
|
||
|
op_VECL uint32 = 0xE7D9 // VRR-a VECTOR ELEMENT COMPARE LOGICAL
|
||
|
op_VERIM uint32 = 0xE772 // VRI-d VECTOR ELEMENT ROTATE AND INSERT UNDER MASK
|
||
|
op_VERLL uint32 = 0xE733 // VRS-a VECTOR ELEMENT ROTATE LEFT LOGICAL
|
||
|
op_VERLLV uint32 = 0xE773 // VRR-c VECTOR ELEMENT ROTATE LEFT LOGICAL
|
||
|
op_VESLV uint32 = 0xE770 // VRR-c VECTOR ELEMENT SHIFT LEFT
|
||
|
op_VESL uint32 = 0xE730 // VRS-a VECTOR ELEMENT SHIFT LEFT
|
||
|
op_VESRA uint32 = 0xE73A // VRS-a VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
|
||
|
op_VESRAV uint32 = 0xE77A // VRR-c VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
|
||
|
op_VESRL uint32 = 0xE738 // VRS-a VECTOR ELEMENT SHIFT RIGHT LOGICAL
|
||
|
op_VESRLV uint32 = 0xE778 // VRR-c VECTOR ELEMENT SHIFT RIGHT LOGICAL
|
||
|
op_VX uint32 = 0xE76D // VRR-c VECTOR EXCLUSIVE OR
|
||
|
op_VFAE uint32 = 0xE782 // VRR-b VECTOR FIND ANY ELEMENT EQUAL
|
||
|
op_VFEE uint32 = 0xE780 // VRR-b VECTOR FIND ELEMENT EQUAL
|
||
|
op_VFENE uint32 = 0xE781 // VRR-b VECTOR FIND ELEMENT NOT EQUAL
|
||
|
op_VFA uint32 = 0xE7E3 // VRR-c VECTOR FP ADD
|
||
|
op_WFK uint32 = 0xE7CA // VRR-a VECTOR FP COMPARE AND SIGNAL SCALAR
|
||
|
op_VFCE uint32 = 0xE7E8 // VRR-c VECTOR FP COMPARE EQUAL
|
||
|
op_VFCH uint32 = 0xE7EB // VRR-c VECTOR FP COMPARE HIGH
|
||
|
op_VFCHE uint32 = 0xE7EA // VRR-c VECTOR FP COMPARE HIGH OR EQUAL
|
||
|
op_WFC uint32 = 0xE7CB // VRR-a VECTOR FP COMPARE SCALAR
|
||
|
op_VCDG uint32 = 0xE7C3 // VRR-a VECTOR FP CONVERT FROM FIXED 64-BIT
|
||
|
op_VCDLG uint32 = 0xE7C1 // VRR-a VECTOR FP CONVERT FROM LOGICAL 64-BIT
|
||
|
op_VCGD uint32 = 0xE7C2 // VRR-a VECTOR FP CONVERT TO FIXED 64-BIT
|
||
|
op_VCLGD uint32 = 0xE7C0 // VRR-a VECTOR FP CONVERT TO LOGICAL 64-BIT
|
||
|
op_VFD uint32 = 0xE7E5 // VRR-c VECTOR FP DIVIDE
|
||
|
op_VLDE uint32 = 0xE7C4 // VRR-a VECTOR FP LOAD LENGTHENED
|
||
|
op_VLED uint32 = 0xE7C5 // VRR-a VECTOR FP LOAD ROUNDED
|
||
|
op_VFM uint32 = 0xE7E7 // VRR-c VECTOR FP MULTIPLY
|
||
|
op_VFMA uint32 = 0xE78F // VRR-e VECTOR FP MULTIPLY AND ADD
|
||
|
op_VFMS uint32 = 0xE78E // VRR-e VECTOR FP MULTIPLY AND SUBTRACT
|
||
|
op_VFPSO uint32 = 0xE7CC // VRR-a VECTOR FP PERFORM SIGN OPERATION
|
||
|
op_VFSQ uint32 = 0xE7CE // VRR-a VECTOR FP SQUARE ROOT
|
||
|
op_VFS uint32 = 0xE7E2 // VRR-c VECTOR FP SUBTRACT
|
||
|
op_VFTCI uint32 = 0xE74A // VRI-e VECTOR FP TEST DATA CLASS IMMEDIATE
|
||
|
op_VGFM uint32 = 0xE7B4 // VRR-c VECTOR GALOIS FIELD MULTIPLY SUM
|
||
|
op_VGFMA uint32 = 0xE7BC // VRR-d VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE
|
||
|
op_VGEF uint32 = 0xE713 // VRV VECTOR GATHER ELEMENT (32)
|
||
|
op_VGEG uint32 = 0xE712 // VRV VECTOR GATHER ELEMENT (64)
|
||
|
op_VGBM uint32 = 0xE744 // VRI-a VECTOR GENERATE BYTE MASK
|
||
|
op_VGM uint32 = 0xE746 // VRI-b VECTOR GENERATE MASK
|
||
|
op_VISTR uint32 = 0xE75C // VRR-a VECTOR ISOLATE STRING
|
||
|
op_VL uint32 = 0xE706 // VRX VECTOR LOAD
|
||
|
op_VLR uint32 = 0xE756 // VRR-a VECTOR LOAD
|
||
|
op_VLREP uint32 = 0xE705 // VRX VECTOR LOAD AND REPLICATE
|
||
|
op_VLC uint32 = 0xE7DE // VRR-a VECTOR LOAD COMPLEMENT
|
||
|
op_VLEH uint32 = 0xE701 // VRX VECTOR LOAD ELEMENT (16)
|
||
|
op_VLEF uint32 = 0xE703 // VRX VECTOR LOAD ELEMENT (32)
|
||
|
op_VLEG uint32 = 0xE702 // VRX VECTOR LOAD ELEMENT (64)
|
||
|
op_VLEB uint32 = 0xE700 // VRX VECTOR LOAD ELEMENT (8)
|
||
|
op_VLEIH uint32 = 0xE741 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (16)
|
||
|
op_VLEIF uint32 = 0xE743 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (32)
|
||
|
op_VLEIG uint32 = 0xE742 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (64)
|
||
|
op_VLEIB uint32 = 0xE740 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (8)
|
||
|
op_VFI uint32 = 0xE7C7 // VRR-a VECTOR LOAD FP INTEGER
|
||
|
op_VLGV uint32 = 0xE721 // VRS-c VECTOR LOAD GR FROM VR ELEMENT
|
||
|
op_VLLEZ uint32 = 0xE704 // VRX VECTOR LOAD LOGICAL ELEMENT AND ZERO
|
||
|
op_VLM uint32 = 0xE736 // VRS-a VECTOR LOAD MULTIPLE
|
||
|
op_VLP uint32 = 0xE7DF // VRR-a VECTOR LOAD POSITIVE
|
||
|
op_VLBB uint32 = 0xE707 // VRX VECTOR LOAD TO BLOCK BOUNDARY
|
||
|
op_VLVG uint32 = 0xE722 // VRS-b VECTOR LOAD VR ELEMENT FROM GR
|
||
|
op_VLVGP uint32 = 0xE762 // VRR-f VECTOR LOAD VR FROM GRS DISJOINT
|
||
|
op_VLL uint32 = 0xE737 // VRS-b VECTOR LOAD WITH LENGTH
|
||
|
op_VMX uint32 = 0xE7FF // VRR-c VECTOR MAXIMUM
|
||
|
op_VMXL uint32 = 0xE7FD // VRR-c VECTOR MAXIMUM LOGICAL
|
||
|
op_VMRH uint32 = 0xE761 // VRR-c VECTOR MERGE HIGH
|
||
|
op_VMRL uint32 = 0xE760 // VRR-c VECTOR MERGE LOW
|
||
|
op_VMN uint32 = 0xE7FE // VRR-c VECTOR MINIMUM
|
||
|
op_VMNL uint32 = 0xE7FC // VRR-c VECTOR MINIMUM LOGICAL
|
||
|
op_VMAE uint32 = 0xE7AE // VRR-d VECTOR MULTIPLY AND ADD EVEN
|
||
|
op_VMAH uint32 = 0xE7AB // VRR-d VECTOR MULTIPLY AND ADD HIGH
|
||
|
op_VMALE uint32 = 0xE7AC // VRR-d VECTOR MULTIPLY AND ADD LOGICAL EVEN
|
||
|
op_VMALH uint32 = 0xE7A9 // VRR-d VECTOR MULTIPLY AND ADD LOGICAL HIGH
|
||
|
op_VMALO uint32 = 0xE7AD // VRR-d VECTOR MULTIPLY AND ADD LOGICAL ODD
|
||
|
op_VMAL uint32 = 0xE7AA // VRR-d VECTOR MULTIPLY AND ADD LOW
|
||
|
op_VMAO uint32 = 0xE7AF // VRR-d VECTOR MULTIPLY AND ADD ODD
|
||
|
op_VME uint32 = 0xE7A6 // VRR-c VECTOR MULTIPLY EVEN
|
||
|
op_VMH uint32 = 0xE7A3 // VRR-c VECTOR MULTIPLY HIGH
|
||
|
op_VMLE uint32 = 0xE7A4 // VRR-c VECTOR MULTIPLY EVEN LOGICAL
|
||
|
op_VMLH uint32 = 0xE7A1 // VRR-c VECTOR MULTIPLY HIGH LOGICAL
|
||
|
op_VMLO uint32 = 0xE7A5 // VRR-c VECTOR MULTIPLY ODD LOGICAL
|
||
|
op_VML uint32 = 0xE7A2 // VRR-c VECTOR MULTIPLY LOW
|
||
|
op_VMO uint32 = 0xE7A7 // VRR-c VECTOR MULTIPLY ODD
|
||
|
op_VNO uint32 = 0xE76B // VRR-c VECTOR NOR
|
||
|
op_VO uint32 = 0xE76A // VRR-c VECTOR OR
|
||
|
op_VPK uint32 = 0xE794 // VRR-c VECTOR PACK
|
||
|
op_VPKLS uint32 = 0xE795 // VRR-b VECTOR PACK LOGICAL SATURATE
|
||
|
op_VPKS uint32 = 0xE797 // VRR-b VECTOR PACK SATURATE
|
||
|
op_VPERM uint32 = 0xE78C // VRR-e VECTOR PERMUTE
|
||
|
op_VPDI uint32 = 0xE784 // VRR-c VECTOR PERMUTE DOUBLEWORD IMMEDIATE
|
||
|
op_VPOPCT uint32 = 0xE750 // VRR-a VECTOR POPULATION COUNT
|
||
|
op_VREP uint32 = 0xE74D // VRI-c VECTOR REPLICATE
|
||
|
op_VREPI uint32 = 0xE745 // VRI-a VECTOR REPLICATE IMMEDIATE
|
||
|
op_VSCEF uint32 = 0xE71B // VRV VECTOR SCATTER ELEMENT (32)
|
||
|
op_VSCEG uint32 = 0xE71A // VRV VECTOR SCATTER ELEMENT (64)
|
||
|
op_VSEL uint32 = 0xE78D // VRR-e VECTOR SELECT
|
||
|
op_VSL uint32 = 0xE774 // VRR-c VECTOR SHIFT LEFT
|
||
|
op_VSLB uint32 = 0xE775 // VRR-c VECTOR SHIFT LEFT BY BYTE
|
||
|
op_VSLDB uint32 = 0xE777 // VRI-d VECTOR SHIFT LEFT DOUBLE BY BYTE
|
||
|
op_VSRA uint32 = 0xE77E // VRR-c VECTOR SHIFT RIGHT ARITHMETIC
|
||
|
op_VSRAB uint32 = 0xE77F // VRR-c VECTOR SHIFT RIGHT ARITHMETIC BY BYTE
|
||
|
op_VSRL uint32 = 0xE77C // VRR-c VECTOR SHIFT RIGHT LOGICAL
|
||
|
op_VSRLB uint32 = 0xE77D // VRR-c VECTOR SHIFT RIGHT LOGICAL BY BYTE
|
||
|
op_VSEG uint32 = 0xE75F // VRR-a VECTOR SIGN EXTEND TO DOUBLEWORD
|
||
|
op_VST uint32 = 0xE70E // VRX VECTOR STORE
|
||
|
op_VSTEH uint32 = 0xE709 // VRX VECTOR STORE ELEMENT (16)
|
||
|
op_VSTEF uint32 = 0xE70B // VRX VECTOR STORE ELEMENT (32)
|
||
|
op_VSTEG uint32 = 0xE70A // VRX VECTOR STORE ELEMENT (64)
|
||
|
op_VSTEB uint32 = 0xE708 // VRX VECTOR STORE ELEMENT (8)
|
||
|
op_VSTM uint32 = 0xE73E // VRS-a VECTOR STORE MULTIPLE
|
||
|
op_VSTL uint32 = 0xE73F // VRS-b VECTOR STORE WITH LENGTH
|
||
|
op_VSTRC uint32 = 0xE78A // VRR-d VECTOR STRING RANGE COMPARE
|
||
|
op_VS uint32 = 0xE7F7 // VRR-c VECTOR SUBTRACT
|
||
|
op_VSCBI uint32 = 0xE7F5 // VRR-c VECTOR SUBTRACT COMPUTE BORROW INDICATION
|
||
|
op_VSBCBI uint32 = 0xE7BD // VRR-d VECTOR SUBTRACT WITH BORROW COMPUTE BORROW INDICATION
|
||
|
op_VSBI uint32 = 0xE7BF // VRR-d VECTOR SUBTRACT WITH BORROW INDICATION
|
||
|
op_VSUMG uint32 = 0xE765 // VRR-c VECTOR SUM ACROSS DOUBLEWORD
|
||
|
op_VSUMQ uint32 = 0xE767 // VRR-c VECTOR SUM ACROSS QUADWORD
|
||
|
op_VSUM uint32 = 0xE764 // VRR-c VECTOR SUM ACROSS WORD
|
||
|
op_VTM uint32 = 0xE7D8 // VRR-a VECTOR TEST UNDER MASK
|
||
|
op_VUPH uint32 = 0xE7D7 // VRR-a VECTOR UNPACK HIGH
|
||
|
op_VUPLH uint32 = 0xE7D5 // VRR-a VECTOR UNPACK LOGICAL HIGH
|
||
|
op_VUPLL uint32 = 0xE7D4 // VRR-a VECTOR UNPACK LOGICAL LOW
|
||
|
op_VUPL uint32 = 0xE7D6 // VRR-a VECTOR UNPACK LOW
|
||
|
op_VMSL uint32 = 0xE7B8 // VRR-d VECTOR MULTIPLY SUM LOGICAL
|
||
|
)
|
||
|
|
||
|
func oclass(a *obj.Addr) int {
|
||
|
return int(a.Class) - 1
|
||
|
}
|
||
|
|
||
|
// Add a relocation for the immediate in a RIL style instruction.
|
||
|
// The addend will be adjusted as required.
|
||
|
func (c *ctxtz) addrilreloc(sym *obj.LSym, add int64) *obj.Reloc {
|
||
|
if sym == nil {
|
||
|
c.ctxt.Diag("require symbol to apply relocation")
|
||
|
}
|
||
|
offset := int64(2) // relocation offset from start of instruction
|
||
|
rel := obj.Addrel(c.cursym)
|
||
|
rel.Off = int32(c.pc + offset)
|
||
|
rel.Siz = 4
|
||
|
rel.Sym = sym
|
||
|
rel.Add = add + offset + int64(rel.Siz)
|
||
|
rel.Type = objabi.R_PCRELDBL
|
||
|
return rel
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) addrilrelocoffset(sym *obj.LSym, add, offset int64) *obj.Reloc {
|
||
|
if sym == nil {
|
||
|
c.ctxt.Diag("require symbol to apply relocation")
|
||
|
}
|
||
|
offset += int64(2) // relocation offset from start of instruction
|
||
|
rel := obj.Addrel(c.cursym)
|
||
|
rel.Off = int32(c.pc + offset)
|
||
|
rel.Siz = 4
|
||
|
rel.Sym = sym
|
||
|
rel.Add = add + offset + int64(rel.Siz)
|
||
|
rel.Type = objabi.R_PCRELDBL
|
||
|
return rel
|
||
|
}
|
||
|
|
||
|
// Add a CALL relocation for the immediate in a RIL style instruction.
|
||
|
// The addend will be adjusted as required.
|
||
|
func (c *ctxtz) addcallreloc(sym *obj.LSym, add int64) *obj.Reloc {
|
||
|
if sym == nil {
|
||
|
c.ctxt.Diag("require symbol to apply relocation")
|
||
|
}
|
||
|
offset := int64(2) // relocation offset from start of instruction
|
||
|
rel := obj.Addrel(c.cursym)
|
||
|
rel.Off = int32(c.pc + offset)
|
||
|
rel.Siz = 4
|
||
|
rel.Sym = sym
|
||
|
rel.Add = add + offset + int64(rel.Siz)
|
||
|
rel.Type = objabi.R_CALL
|
||
|
return rel
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) branchMask(p *obj.Prog) CCMask {
|
||
|
switch p.As {
|
||
|
case ABRC, ALOCR, ALOCGR,
|
||
|
ACRJ, ACGRJ, ACIJ, ACGIJ,
|
||
|
ACLRJ, ACLGRJ, ACLIJ, ACLGIJ:
|
||
|
return CCMask(p.From.Offset)
|
||
|
case ABEQ, ACMPBEQ, ACMPUBEQ, AMOVDEQ:
|
||
|
return Equal
|
||
|
case ABGE, ACMPBGE, ACMPUBGE, AMOVDGE:
|
||
|
return GreaterOrEqual
|
||
|
case ABGT, ACMPBGT, ACMPUBGT, AMOVDGT:
|
||
|
return Greater
|
||
|
case ABLE, ACMPBLE, ACMPUBLE, AMOVDLE:
|
||
|
return LessOrEqual
|
||
|
case ABLT, ACMPBLT, ACMPUBLT, AMOVDLT:
|
||
|
return Less
|
||
|
case ABNE, ACMPBNE, ACMPUBNE, AMOVDNE:
|
||
|
return NotEqual
|
||
|
case ABLEU: // LE or unordered
|
||
|
return NotGreater
|
||
|
case ABLTU: // LT or unordered
|
||
|
return LessOrUnordered
|
||
|
case ABVC:
|
||
|
return Never // needs extra instruction
|
||
|
case ABVS:
|
||
|
return Unordered
|
||
|
}
|
||
|
c.ctxt.Diag("unknown conditional branch %v", p.As)
|
||
|
return Always
|
||
|
}
|
||
|
|
||
|
func regtmp(p *obj.Prog) uint32 {
|
||
|
p.Mark |= USETMP
|
||
|
return REGTMP
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
|
||
|
o := c.oplook(p)
|
||
|
|
||
|
if o == nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// If REGTMP is used in generated code, we need to set USETMP on p.Mark.
|
||
|
// So we use regtmp(p) for REGTMP.
|
||
|
|
||
|
switch o.i {
|
||
|
default:
|
||
|
c.ctxt.Diag("unknown index %d", o.i)
|
||
|
|
||
|
case 0: // PSEUDO OPS
|
||
|
break
|
||
|
|
||
|
case 1: // mov reg reg
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("unhandled operation: %v", p.As)
|
||
|
case AMOVD:
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
// sign extend
|
||
|
case AMOVW:
|
||
|
zRRE(op_LGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case AMOVH:
|
||
|
zRRE(op_LGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case AMOVB:
|
||
|
zRRE(op_LGBR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
// zero extend
|
||
|
case AMOVWZ:
|
||
|
zRRE(op_LLGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case AMOVHZ:
|
||
|
zRRE(op_LLGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case AMOVBZ:
|
||
|
zRRE(op_LLGCR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
// reverse bytes
|
||
|
case AMOVDBR:
|
||
|
zRRE(op_LRVGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case AMOVWBR:
|
||
|
zRRE(op_LRVR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
// floating point
|
||
|
case AFMOVD, AFMOVS:
|
||
|
zRR(op_LDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case 2: // arithmetic op reg [reg] reg
|
||
|
r := p.Reg
|
||
|
if r == 0 {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
|
||
|
var opcode uint32
|
||
|
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("invalid opcode")
|
||
|
case AADD:
|
||
|
opcode = op_AGRK
|
||
|
case AADDC:
|
||
|
opcode = op_ALGRK
|
||
|
case AADDE:
|
||
|
opcode = op_ALCGR
|
||
|
case AADDW:
|
||
|
opcode = op_ARK
|
||
|
case AMULLW:
|
||
|
opcode = op_MSGFR
|
||
|
case AMULLD:
|
||
|
opcode = op_MSGR
|
||
|
case ADIVW, AMODW:
|
||
|
opcode = op_DSGFR
|
||
|
case ADIVWU, AMODWU:
|
||
|
opcode = op_DLR
|
||
|
case ADIVD, AMODD:
|
||
|
opcode = op_DSGR
|
||
|
case ADIVDU, AMODDU:
|
||
|
opcode = op_DLGR
|
||
|
}
|
||
|
|
||
|
switch p.As {
|
||
|
default:
|
||
|
|
||
|
case AADD, AADDC, AADDW:
|
||
|
if p.As == AADDW && r == p.To.Reg {
|
||
|
zRR(op_AR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else {
|
||
|
zRRF(opcode, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
|
||
|
case AADDE, AMULLW, AMULLD:
|
||
|
if r == p.To.Reg {
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else if p.From.Reg == p.To.Reg {
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
|
||
|
} else {
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case ADIVW, ADIVWU, ADIVD, ADIVDU:
|
||
|
if p.As == ADIVWU || p.As == ADIVDU {
|
||
|
zRI(op_LGHI, regtmp(p), 0, asm)
|
||
|
}
|
||
|
zRRE(op_LGR, REGTMP2, uint32(r), asm)
|
||
|
zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), REGTMP2, asm)
|
||
|
|
||
|
case AMODW, AMODWU, AMODD, AMODDU:
|
||
|
if p.As == AMODWU || p.As == AMODDU {
|
||
|
zRI(op_LGHI, regtmp(p), 0, asm)
|
||
|
}
|
||
|
zRRE(op_LGR, REGTMP2, uint32(r), asm)
|
||
|
zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
|
||
|
}
|
||
|
|
||
|
case 3: // mov $constant reg
|
||
|
v := c.vregoff(&p.From)
|
||
|
switch p.As {
|
||
|
case AMOVBZ:
|
||
|
v = int64(uint8(v))
|
||
|
case AMOVHZ:
|
||
|
v = int64(uint16(v))
|
||
|
case AMOVWZ:
|
||
|
v = int64(uint32(v))
|
||
|
case AMOVB:
|
||
|
v = int64(int8(v))
|
||
|
case AMOVH:
|
||
|
v = int64(int16(v))
|
||
|
case AMOVW:
|
||
|
v = int64(int32(v))
|
||
|
}
|
||
|
if int64(int16(v)) == v {
|
||
|
zRI(op_LGHI, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if v&0xffff0000 == v {
|
||
|
zRI(op_LLILH, uint32(p.To.Reg), uint32(v>>16), asm)
|
||
|
} else if v&0xffff00000000 == v {
|
||
|
zRI(op_LLIHL, uint32(p.To.Reg), uint32(v>>32), asm)
|
||
|
} else if uint64(v)&0xffff000000000000 == uint64(v) {
|
||
|
zRI(op_LLIHH, uint32(p.To.Reg), uint32(v>>48), asm)
|
||
|
} else if int64(int32(v)) == v {
|
||
|
zRIL(_a, op_LGFI, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if int64(uint32(v)) == v {
|
||
|
zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if uint64(v)&0xffffffff00000000 == uint64(v) {
|
||
|
zRIL(_a, op_LLIHF, uint32(p.To.Reg), uint32(v>>32), asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
zRIL(_a, op_IIHF, uint32(p.To.Reg), uint32(v>>32), asm)
|
||
|
}
|
||
|
|
||
|
case 4: // multiply high (a*b)>>64
|
||
|
r := p.Reg
|
||
|
if r == 0 {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
zRRE(op_LGR, REGTMP2, uint32(r), asm)
|
||
|
zRRE(op_MLGR, regtmp(p), uint32(p.From.Reg), asm)
|
||
|
switch p.As {
|
||
|
case AMULHDU:
|
||
|
// Unsigned: move result into correct register.
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
case AMULHD:
|
||
|
// Signed: need to convert result.
|
||
|
// See Hacker's Delight 8-3.
|
||
|
zRSY(op_SRAG, REGTMP2, uint32(p.From.Reg), 0, 63, asm)
|
||
|
zRRE(op_NGR, REGTMP2, uint32(r), asm)
|
||
|
zRRE(op_SGR, regtmp(p), REGTMP2, asm)
|
||
|
zRSY(op_SRAG, REGTMP2, uint32(r), 0, 63, asm)
|
||
|
zRRE(op_NGR, REGTMP2, uint32(p.From.Reg), asm)
|
||
|
zRRF(op_SGRK, REGTMP2, 0, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
}
|
||
|
|
||
|
case 5: // syscall
|
||
|
zI(op_SVC, 0, asm)
|
||
|
|
||
|
case 6: // logical op reg [reg] reg
|
||
|
var oprr, oprre, oprrf uint32
|
||
|
switch p.As {
|
||
|
case AAND:
|
||
|
oprre = op_NGR
|
||
|
oprrf = op_NGRK
|
||
|
case AANDW:
|
||
|
oprr = op_NR
|
||
|
oprrf = op_NRK
|
||
|
case AOR:
|
||
|
oprre = op_OGR
|
||
|
oprrf = op_OGRK
|
||
|
case AORW:
|
||
|
oprr = op_OR
|
||
|
oprrf = op_ORK
|
||
|
case AXOR:
|
||
|
oprre = op_XGR
|
||
|
oprrf = op_XGRK
|
||
|
case AXORW:
|
||
|
oprr = op_XR
|
||
|
oprrf = op_XRK
|
||
|
}
|
||
|
if p.Reg == 0 {
|
||
|
if oprr != 0 {
|
||
|
zRR(oprr, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else {
|
||
|
zRRE(oprre, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
} else {
|
||
|
zRRF(oprrf, uint32(p.Reg), 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case 7: // shift/rotate reg [reg] reg
|
||
|
d2 := c.vregoff(&p.From)
|
||
|
b2 := p.From.Reg
|
||
|
r3 := p.Reg
|
||
|
if r3 == 0 {
|
||
|
r3 = p.To.Reg
|
||
|
}
|
||
|
r1 := p.To.Reg
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
case ASLD:
|
||
|
opcode = op_SLLG
|
||
|
case ASRD:
|
||
|
opcode = op_SRLG
|
||
|
case ASLW:
|
||
|
opcode = op_SLLK
|
||
|
case ASRW:
|
||
|
opcode = op_SRLK
|
||
|
case ARLL:
|
||
|
opcode = op_RLL
|
||
|
case ARLLG:
|
||
|
opcode = op_RLLG
|
||
|
case ASRAW:
|
||
|
opcode = op_SRAK
|
||
|
case ASRAD:
|
||
|
opcode = op_SRAG
|
||
|
}
|
||
|
zRSY(opcode, uint32(r1), uint32(r3), uint32(b2), uint32(d2), asm)
|
||
|
|
||
|
case 8: // find leftmost one
|
||
|
if p.To.Reg&1 != 0 {
|
||
|
c.ctxt.Diag("target must be an even-numbered register")
|
||
|
}
|
||
|
// FLOGR also writes a mask to p.To.Reg+1.
|
||
|
zRRE(op_FLOGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 9: // population count
|
||
|
zRRE(op_POPCNT, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 10: // subtract reg [reg] reg
|
||
|
r := int(p.Reg)
|
||
|
|
||
|
switch p.As {
|
||
|
default:
|
||
|
case ASUB:
|
||
|
if r == 0 {
|
||
|
zRRE(op_SGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else {
|
||
|
zRRF(op_SGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
case ASUBC:
|
||
|
if r == 0 {
|
||
|
zRRE(op_SLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else {
|
||
|
zRRF(op_SLGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
case ASUBE:
|
||
|
if r == 0 {
|
||
|
r = int(p.To.Reg)
|
||
|
}
|
||
|
if r == int(p.To.Reg) {
|
||
|
zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else if p.From.Reg == p.To.Reg {
|
||
|
zRRE(op_LGR, regtmp(p), uint32(p.From.Reg), asm)
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
zRRE(op_SLBGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
} else {
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
case ASUBW:
|
||
|
if r == 0 {
|
||
|
zRR(op_SR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
} else {
|
||
|
zRRF(op_SRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
case 11: // br/bl
|
||
|
v := int32(0)
|
||
|
|
||
|
if p.To.Target() != nil {
|
||
|
v = int32((p.To.Target().Pc - p.Pc) >> 1)
|
||
|
}
|
||
|
|
||
|
if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v {
|
||
|
zRI(op_BRC, 0xF, uint32(v), asm)
|
||
|
} else {
|
||
|
if p.As == ABL {
|
||
|
zRIL(_b, op_BRASL, uint32(REG_LR), uint32(v), asm)
|
||
|
} else {
|
||
|
zRIL(_c, op_BRCL, 0xF, uint32(v), asm)
|
||
|
}
|
||
|
if p.To.Sym != nil {
|
||
|
c.addcallreloc(p.To.Sym, p.To.Offset)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
case 12:
|
||
|
r1 := p.To.Reg
|
||
|
d2 := c.vregoff(&p.From)
|
||
|
b2 := p.From.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
x2 := p.From.Index
|
||
|
if -DISP20/2 > d2 || d2 >= DISP20/2 {
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
|
||
|
if x2 != 0 {
|
||
|
zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
|
||
|
}
|
||
|
x2 = int16(regtmp(p))
|
||
|
d2 = 0
|
||
|
}
|
||
|
var opx, opxy uint32
|
||
|
switch p.As {
|
||
|
case AADD:
|
||
|
opxy = op_AG
|
||
|
case AADDC:
|
||
|
opxy = op_ALG
|
||
|
case AADDE:
|
||
|
opxy = op_ALCG
|
||
|
case AADDW:
|
||
|
opx = op_A
|
||
|
opxy = op_AY
|
||
|
case AMULLW:
|
||
|
opx = op_MS
|
||
|
opxy = op_MSY
|
||
|
case AMULLD:
|
||
|
opxy = op_MSG
|
||
|
case ASUB:
|
||
|
opxy = op_SG
|
||
|
case ASUBC:
|
||
|
opxy = op_SLG
|
||
|
case ASUBE:
|
||
|
opxy = op_SLBG
|
||
|
case ASUBW:
|
||
|
opx = op_S
|
||
|
opxy = op_SY
|
||
|
case AAND:
|
||
|
opxy = op_NG
|
||
|
case AANDW:
|
||
|
opx = op_N
|
||
|
opxy = op_NY
|
||
|
case AOR:
|
||
|
opxy = op_OG
|
||
|
case AORW:
|
||
|
opx = op_O
|
||
|
opxy = op_OY
|
||
|
case AXOR:
|
||
|
opxy = op_XG
|
||
|
case AXORW:
|
||
|
opx = op_X
|
||
|
opxy = op_XY
|
||
|
}
|
||
|
if opx != 0 && 0 <= d2 && d2 < DISP12 {
|
||
|
zRX(opx, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
} else {
|
||
|
zRXY(opxy, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
}
|
||
|
|
||
|
case 13: // rotate, followed by operation
|
||
|
r1 := p.To.Reg
|
||
|
r2 := p.RestArgs[2].Reg
|
||
|
i3 := uint8(p.From.Offset) // start
|
||
|
i4 := uint8(p.RestArgs[0].Offset) // end
|
||
|
i5 := uint8(p.RestArgs[1].Offset) // rotate amount
|
||
|
switch p.As {
|
||
|
case ARNSBGT, ARXSBGT, AROSBGT:
|
||
|
i3 |= 0x80 // test-results
|
||
|
case ARISBGZ, ARISBGNZ, ARISBHGZ, ARISBLGZ:
|
||
|
i4 |= 0x80 // zero-remaining-bits
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ARNSBG, ARNSBGT:
|
||
|
opcode = op_RNSBG
|
||
|
case ARXSBG, ARXSBGT:
|
||
|
opcode = op_RXSBG
|
||
|
case AROSBG, AROSBGT:
|
||
|
opcode = op_ROSBG
|
||
|
case ARISBG, ARISBGZ:
|
||
|
opcode = op_RISBG
|
||
|
case ARISBGN, ARISBGNZ:
|
||
|
opcode = op_RISBGN
|
||
|
case ARISBHG, ARISBHGZ:
|
||
|
opcode = op_RISBHG
|
||
|
case ARISBLG, ARISBLGZ:
|
||
|
opcode = op_RISBLG
|
||
|
}
|
||
|
zRIE(_f, uint32(opcode), uint32(r1), uint32(r2), 0, uint32(i3), uint32(i4), 0, uint32(i5), asm)
|
||
|
|
||
|
case 15: // br/bl (reg)
|
||
|
r := p.To.Reg
|
||
|
if p.As == ABCL || p.As == ABL {
|
||
|
zRR(op_BASR, uint32(REG_LR), uint32(r), asm)
|
||
|
} else {
|
||
|
zRR(op_BCR, uint32(Always), uint32(r), asm)
|
||
|
}
|
||
|
|
||
|
case 16: // conditional branch
|
||
|
v := int32(0)
|
||
|
if p.To.Target() != nil {
|
||
|
v = int32((p.To.Target().Pc - p.Pc) >> 1)
|
||
|
}
|
||
|
mask := uint32(c.branchMask(p))
|
||
|
if p.To.Sym == nil && int32(int16(v)) == v {
|
||
|
zRI(op_BRC, mask, uint32(v), asm)
|
||
|
} else {
|
||
|
zRIL(_c, op_BRCL, mask, uint32(v), asm)
|
||
|
}
|
||
|
if p.To.Sym != nil {
|
||
|
c.addrilreloc(p.To.Sym, p.To.Offset)
|
||
|
}
|
||
|
|
||
|
case 17: // move on condition
|
||
|
m3 := uint32(c.branchMask(p))
|
||
|
zRRF(op_LOCGR, m3, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 18: // br/bl reg
|
||
|
if p.As == ABL {
|
||
|
zRR(op_BASR, uint32(REG_LR), uint32(p.To.Reg), asm)
|
||
|
} else {
|
||
|
zRR(op_BCR, uint32(Always), uint32(p.To.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case 19: // mov $sym+n(SB) reg
|
||
|
d := c.vregoff(&p.From)
|
||
|
zRIL(_b, op_LARL, uint32(p.To.Reg), 0, asm)
|
||
|
if d&1 != 0 {
|
||
|
zRX(op_LA, uint32(p.To.Reg), uint32(p.To.Reg), 0, 1, asm)
|
||
|
d -= 1
|
||
|
}
|
||
|
c.addrilreloc(p.From.Sym, d)
|
||
|
|
||
|
case 21: // subtract $constant [reg] reg
|
||
|
v := c.vregoff(&p.From)
|
||
|
r := p.Reg
|
||
|
if r == 0 {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
switch p.As {
|
||
|
case ASUB:
|
||
|
zRIL(_a, op_LGFI, uint32(regtmp(p)), uint32(v), asm)
|
||
|
zRRF(op_SLGRK, uint32(regtmp(p)), 0, uint32(p.To.Reg), uint32(r), asm)
|
||
|
case ASUBC:
|
||
|
if r != p.To.Reg {
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
zRIL(_a, op_SLGFI, uint32(p.To.Reg), uint32(v), asm)
|
||
|
case ASUBW:
|
||
|
if r != p.To.Reg {
|
||
|
zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
zRIL(_a, op_SLFI, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 22: // add/multiply $constant [reg] reg
|
||
|
v := c.vregoff(&p.From)
|
||
|
r := p.Reg
|
||
|
if r == 0 {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
var opri, opril, oprie uint32
|
||
|
switch p.As {
|
||
|
case AADD:
|
||
|
opri = op_AGHI
|
||
|
opril = op_AGFI
|
||
|
oprie = op_AGHIK
|
||
|
case AADDC:
|
||
|
opril = op_ALGFI
|
||
|
oprie = op_ALGHSIK
|
||
|
case AADDW:
|
||
|
opri = op_AHI
|
||
|
opril = op_AFI
|
||
|
oprie = op_AHIK
|
||
|
case AMULLW:
|
||
|
opri = op_MHI
|
||
|
opril = op_MSFI
|
||
|
case AMULLD:
|
||
|
opri = op_MGHI
|
||
|
opril = op_MSGFI
|
||
|
}
|
||
|
if r != p.To.Reg && (oprie == 0 || int64(int16(v)) != v) {
|
||
|
switch p.As {
|
||
|
case AADD, AADDC, AMULLD:
|
||
|
zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
case AADDW, AMULLW:
|
||
|
zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
if opri != 0 && r == p.To.Reg && int64(int16(v)) == v {
|
||
|
zRI(opri, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if oprie != 0 && int64(int16(v)) == v {
|
||
|
zRIE(_d, oprie, uint32(p.To.Reg), uint32(r), uint32(v), 0, 0, 0, 0, asm)
|
||
|
} else {
|
||
|
zRIL(_a, opril, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 23: // 64-bit logical op $constant reg
|
||
|
// TODO(mundaym): merge with case 24.
|
||
|
v := c.vregoff(&p.From)
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("%v is not supported", p)
|
||
|
case AAND:
|
||
|
if v >= 0 { // needs zero extend
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
|
||
|
zRRE(op_NGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
} else if int64(int16(v)) == v {
|
||
|
zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else { // r.To.Reg & 0xffffffff00000000 & uint32(v)
|
||
|
zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
case AOR:
|
||
|
if int64(uint32(v)) != v { // needs sign extend
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
|
||
|
zRRE(op_OGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
} else if int64(uint16(v)) == v {
|
||
|
zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
case AXOR:
|
||
|
if int64(uint32(v)) != v { // needs sign extend
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
|
||
|
zRRE(op_XGR, uint32(p.To.Reg), regtmp(p), asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
case 24: // 32-bit logical op $constant reg
|
||
|
v := c.vregoff(&p.From)
|
||
|
switch p.As {
|
||
|
case AANDW:
|
||
|
if uint32(v&0xffff0000) == 0xffff0000 {
|
||
|
zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if uint32(v&0x0000ffff) == 0x0000ffff {
|
||
|
zRI(op_NILH, uint32(p.To.Reg), uint32(v)>>16, asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
case AORW:
|
||
|
if uint32(v&0xffff0000) == 0 {
|
||
|
zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if uint32(v&0x0000ffff) == 0 {
|
||
|
zRI(op_OILH, uint32(p.To.Reg), uint32(v)>>16, asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
case AXORW:
|
||
|
zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 25: // load on condition (register)
|
||
|
m3 := uint32(c.branchMask(p))
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ALOCR:
|
||
|
opcode = op_LOCR
|
||
|
case ALOCGR:
|
||
|
opcode = op_LOCGR
|
||
|
}
|
||
|
zRRF(opcode, m3, 0, uint32(p.To.Reg), uint32(p.Reg), asm)
|
||
|
|
||
|
case 26: // MOVD $offset(base)(index), reg
|
||
|
v := c.regoff(&p.From)
|
||
|
r := p.From.Reg
|
||
|
if r == 0 {
|
||
|
r = REGSP
|
||
|
}
|
||
|
i := p.From.Index
|
||
|
if v >= 0 && v < DISP12 {
|
||
|
zRX(op_LA, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
|
||
|
} else if v >= -DISP20/2 && v < DISP20/2 {
|
||
|
zRXY(op_LAY, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
|
||
|
} else {
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
|
||
|
zRX(op_LA, uint32(p.To.Reg), uint32(r), regtmp(p), uint32(i), asm)
|
||
|
}
|
||
|
|
||
|
case 31: // dword
|
||
|
wd := uint64(c.vregoff(&p.From))
|
||
|
*asm = append(*asm,
|
||
|
uint8(wd>>56),
|
||
|
uint8(wd>>48),
|
||
|
uint8(wd>>40),
|
||
|
uint8(wd>>32),
|
||
|
uint8(wd>>24),
|
||
|
uint8(wd>>16),
|
||
|
uint8(wd>>8),
|
||
|
uint8(wd))
|
||
|
|
||
|
case 32: // float op freg freg
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("invalid opcode")
|
||
|
case AFADD:
|
||
|
opcode = op_ADBR
|
||
|
case AFADDS:
|
||
|
opcode = op_AEBR
|
||
|
case AFDIV:
|
||
|
opcode = op_DDBR
|
||
|
case AFDIVS:
|
||
|
opcode = op_DEBR
|
||
|
case AFMUL:
|
||
|
opcode = op_MDBR
|
||
|
case AFMULS:
|
||
|
opcode = op_MEEBR
|
||
|
case AFSUB:
|
||
|
opcode = op_SDBR
|
||
|
case AFSUBS:
|
||
|
opcode = op_SEBR
|
||
|
}
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 33: // float op [freg] freg
|
||
|
r := p.From.Reg
|
||
|
if oclass(&p.From) == C_NONE {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
case AFABS:
|
||
|
opcode = op_LPDBR
|
||
|
case AFNABS:
|
||
|
opcode = op_LNDBR
|
||
|
case ALPDFR:
|
||
|
opcode = op_LPDFR
|
||
|
case ALNDFR:
|
||
|
opcode = op_LNDFR
|
||
|
case AFNEG:
|
||
|
opcode = op_LCDFR
|
||
|
case AFNEGS:
|
||
|
opcode = op_LCEBR
|
||
|
case ALEDBR:
|
||
|
opcode = op_LEDBR
|
||
|
case ALDEBR:
|
||
|
opcode = op_LDEBR
|
||
|
case AFSQRT:
|
||
|
opcode = op_SQDBR
|
||
|
case AFSQRTS:
|
||
|
opcode = op_SQEBR
|
||
|
}
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
|
||
|
|
||
|
case 34: // float multiply-add freg freg freg
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("invalid opcode")
|
||
|
case AFMADD:
|
||
|
opcode = op_MADBR
|
||
|
case AFMADDS:
|
||
|
opcode = op_MAEBR
|
||
|
case AFMSUB:
|
||
|
opcode = op_MSDBR
|
||
|
case AFMSUBS:
|
||
|
opcode = op_MSEBR
|
||
|
}
|
||
|
zRRD(opcode, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
|
||
|
|
||
|
case 35: // mov reg mem (no relocation)
|
||
|
d2 := c.regoff(&p.To)
|
||
|
b2 := p.To.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
x2 := p.To.Index
|
||
|
if d2 < -DISP20/2 || d2 >= DISP20/2 {
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
|
||
|
if x2 != 0 {
|
||
|
zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
|
||
|
}
|
||
|
x2 = int16(regtmp(p))
|
||
|
d2 = 0
|
||
|
}
|
||
|
// Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
|
||
|
if op, ok := c.zopstore12(p.As); ok && isU12(d2) {
|
||
|
zRX(op, uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
} else {
|
||
|
zRXY(c.zopstore(p.As), uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
}
|
||
|
|
||
|
case 36: // mov mem reg (no relocation)
|
||
|
d2 := c.regoff(&p.From)
|
||
|
b2 := p.From.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
x2 := p.From.Index
|
||
|
if d2 < -DISP20/2 || d2 >= DISP20/2 {
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
|
||
|
if x2 != 0 {
|
||
|
zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
|
||
|
}
|
||
|
x2 = int16(regtmp(p))
|
||
|
d2 = 0
|
||
|
}
|
||
|
// Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
|
||
|
if op, ok := c.zopload12(p.As); ok && isU12(d2) {
|
||
|
zRX(op, uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
} else {
|
||
|
zRXY(c.zopload(p.As), uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
|
||
|
}
|
||
|
|
||
|
case 40: // word/byte
|
||
|
wd := uint32(c.regoff(&p.From))
|
||
|
if p.As == AWORD { //WORD
|
||
|
*asm = append(*asm, uint8(wd>>24), uint8(wd>>16), uint8(wd>>8), uint8(wd))
|
||
|
} else { //BYTE
|
||
|
*asm = append(*asm, uint8(wd))
|
||
|
}
|
||
|
|
||
|
case 41: // branch on count
|
||
|
r1 := p.From.Reg
|
||
|
ri2 := (p.To.Target().Pc - p.Pc) >> 1
|
||
|
if int64(int16(ri2)) != ri2 {
|
||
|
c.ctxt.Diag("branch target too far away")
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ABRCT:
|
||
|
opcode = op_BRCT
|
||
|
case ABRCTG:
|
||
|
opcode = op_BRCTG
|
||
|
}
|
||
|
zRI(opcode, uint32(r1), uint32(ri2), asm)
|
||
|
|
||
|
case 47: // negate [reg] reg
|
||
|
r := p.From.Reg
|
||
|
if r == 0 {
|
||
|
r = p.To.Reg
|
||
|
}
|
||
|
switch p.As {
|
||
|
case ANEG:
|
||
|
zRRE(op_LCGR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
case ANEGW:
|
||
|
zRRE(op_LCGFR, uint32(p.To.Reg), uint32(r), asm)
|
||
|
}
|
||
|
|
||
|
case 48: // floating-point round to integer
|
||
|
m3 := c.vregoff(&p.From)
|
||
|
if 0 > m3 || m3 > 7 {
|
||
|
c.ctxt.Diag("mask (%v) must be in the range [0, 7]", m3)
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case AFIEBR:
|
||
|
opcode = op_FIEBR
|
||
|
case AFIDBR:
|
||
|
opcode = op_FIDBR
|
||
|
}
|
||
|
zRRF(opcode, uint32(m3), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
|
||
|
|
||
|
case 49: // copysign
|
||
|
zRRF(op_CPSDR, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
|
||
|
|
||
|
case 50: // load and test
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ALTEBR:
|
||
|
opcode = op_LTEBR
|
||
|
case ALTDBR:
|
||
|
opcode = op_LTDBR
|
||
|
}
|
||
|
zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 51: // test data class (immediate only)
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ATCEB:
|
||
|
opcode = op_TCEB
|
||
|
case ATCDB:
|
||
|
opcode = op_TCDB
|
||
|
}
|
||
|
d2 := c.regoff(&p.To)
|
||
|
zRXE(opcode, uint32(p.From.Reg), 0, 0, uint32(d2), 0, asm)
|
||
|
|
||
|
case 62: // equivalent of Mul64 in math/bits
|
||
|
zRRE(op_MLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 66:
|
||
|
zRR(op_BCR, uint32(Never), 0, asm)
|
||
|
|
||
|
case 67: // fmov $0 freg
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case AFMOVS:
|
||
|
opcode = op_LZER
|
||
|
case AFMOVD:
|
||
|
opcode = op_LZDR
|
||
|
}
|
||
|
zRRE(opcode, uint32(p.To.Reg), 0, asm)
|
||
|
|
||
|
case 68: // movw areg reg
|
||
|
zRRE(op_EAR, uint32(p.To.Reg), uint32(p.From.Reg-REG_AR0), asm)
|
||
|
|
||
|
case 69: // movw reg areg
|
||
|
zRRE(op_SAR, uint32(p.To.Reg-REG_AR0), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 70: // cmp reg reg
|
||
|
if p.As == ACMPW || p.As == ACMPWU {
|
||
|
zRR(c.zoprr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
|
||
|
} else {
|
||
|
zRRE(c.zoprre(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case 71: // cmp reg $constant
|
||
|
v := c.vregoff(&p.To)
|
||
|
switch p.As {
|
||
|
case ACMP, ACMPW:
|
||
|
if int64(int32(v)) != v {
|
||
|
c.ctxt.Diag("%v overflows an int32", v)
|
||
|
}
|
||
|
case ACMPU, ACMPWU:
|
||
|
if int64(uint32(v)) != v {
|
||
|
c.ctxt.Diag("%v overflows a uint32", v)
|
||
|
}
|
||
|
}
|
||
|
if p.As == ACMP && int64(int16(v)) == v {
|
||
|
zRI(op_CGHI, uint32(p.From.Reg), uint32(v), asm)
|
||
|
} else if p.As == ACMPW && int64(int16(v)) == v {
|
||
|
zRI(op_CHI, uint32(p.From.Reg), uint32(v), asm)
|
||
|
} else {
|
||
|
zRIL(_a, c.zopril(p.As), uint32(p.From.Reg), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 72: // mov $constant mem
|
||
|
v := c.regoff(&p.From)
|
||
|
d := c.regoff(&p.To)
|
||
|
r := p.To.Reg
|
||
|
if p.To.Index != 0 {
|
||
|
c.ctxt.Diag("cannot use index register")
|
||
|
}
|
||
|
if r == 0 {
|
||
|
r = REGSP
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case AMOVD:
|
||
|
opcode = op_MVGHI
|
||
|
case AMOVW, AMOVWZ:
|
||
|
opcode = op_MVHI
|
||
|
case AMOVH, AMOVHZ:
|
||
|
opcode = op_MVHHI
|
||
|
case AMOVB, AMOVBZ:
|
||
|
opcode = op_MVI
|
||
|
}
|
||
|
if d < 0 || d >= DISP12 {
|
||
|
if r == int16(regtmp(p)) {
|
||
|
c.ctxt.Diag("displacement must be in range [0, 4096) to use %v", r)
|
||
|
}
|
||
|
if d >= -DISP20/2 && d < DISP20/2 {
|
||
|
if opcode == op_MVI {
|
||
|
opcode = op_MVIY
|
||
|
} else {
|
||
|
zRXY(op_LAY, uint32(regtmp(p)), 0, uint32(r), uint32(d), asm)
|
||
|
r = int16(regtmp(p))
|
||
|
d = 0
|
||
|
}
|
||
|
} else {
|
||
|
zRIL(_a, op_LGFI, regtmp(p), uint32(d), asm)
|
||
|
zRX(op_LA, regtmp(p), regtmp(p), uint32(r), 0, asm)
|
||
|
r = int16(regtmp(p))
|
||
|
d = 0
|
||
|
}
|
||
|
}
|
||
|
switch opcode {
|
||
|
case op_MVI:
|
||
|
zSI(opcode, uint32(v), uint32(r), uint32(d), asm)
|
||
|
case op_MVIY:
|
||
|
zSIY(opcode, uint32(v), uint32(r), uint32(d), asm)
|
||
|
default:
|
||
|
zSIL(opcode, uint32(r), uint32(d), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 74: // mov reg addr (including relocation)
|
||
|
i2 := c.regoff(&p.To)
|
||
|
switch p.As {
|
||
|
case AMOVD:
|
||
|
zRIL(_b, op_STGRL, uint32(p.From.Reg), 0, asm)
|
||
|
case AMOVW, AMOVWZ: // The zero extension doesn't affect store instructions
|
||
|
zRIL(_b, op_STRL, uint32(p.From.Reg), 0, asm)
|
||
|
case AMOVH, AMOVHZ: // The zero extension doesn't affect store instructions
|
||
|
zRIL(_b, op_STHRL, uint32(p.From.Reg), 0, asm)
|
||
|
case AMOVB, AMOVBZ: // The zero extension doesn't affect store instructions
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
adj := uint32(0) // adjustment needed for odd addresses
|
||
|
if i2&1 != 0 {
|
||
|
i2 -= 1
|
||
|
adj = 1
|
||
|
}
|
||
|
zRX(op_STC, uint32(p.From.Reg), 0, regtmp(p), adj, asm)
|
||
|
case AFMOVD:
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
zRX(op_STD, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
|
||
|
case AFMOVS:
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
zRX(op_STE, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
|
||
|
}
|
||
|
c.addrilreloc(p.To.Sym, int64(i2))
|
||
|
|
||
|
case 75: // mov addr reg (including relocation)
|
||
|
i2 := c.regoff(&p.From)
|
||
|
switch p.As {
|
||
|
case AMOVD:
|
||
|
if i2&1 != 0 {
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 1, asm)
|
||
|
i2 -= 1
|
||
|
} else {
|
||
|
zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
|
||
|
}
|
||
|
case AMOVW:
|
||
|
zRIL(_b, op_LGFRL, uint32(p.To.Reg), 0, asm)
|
||
|
case AMOVWZ:
|
||
|
zRIL(_b, op_LLGFRL, uint32(p.To.Reg), 0, asm)
|
||
|
case AMOVH:
|
||
|
zRIL(_b, op_LGHRL, uint32(p.To.Reg), 0, asm)
|
||
|
case AMOVHZ:
|
||
|
zRIL(_b, op_LLGHRL, uint32(p.To.Reg), 0, asm)
|
||
|
case AMOVB, AMOVBZ:
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
adj := uint32(0) // adjustment needed for odd addresses
|
||
|
if i2&1 != 0 {
|
||
|
i2 -= 1
|
||
|
adj = 1
|
||
|
}
|
||
|
switch p.As {
|
||
|
case AMOVB:
|
||
|
zRXY(op_LGB, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
|
||
|
case AMOVBZ:
|
||
|
zRXY(op_LLGC, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
|
||
|
}
|
||
|
case AFMOVD:
|
||
|
zRIL(_a, op_LARL, regtmp(p), 0, asm)
|
||
|
zRX(op_LD, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
|
||
|
case AFMOVS:
|
||
|
zRIL(_a, op_LARL, regtmp(p), 0, asm)
|
||
|
zRX(op_LE, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
|
||
|
}
|
||
|
c.addrilreloc(p.From.Sym, int64(i2))
|
||
|
|
||
|
case 76: // set program mask
|
||
|
zRR(op_SPM, uint32(p.From.Reg), 0, asm)
|
||
|
|
||
|
case 77: // syscall $constant
|
||
|
if p.From.Offset > 255 || p.From.Offset < 1 {
|
||
|
c.ctxt.Diag("illegal system call; system call number out of range: %v", p)
|
||
|
zE(op_TRAP2, asm) // trap always
|
||
|
} else {
|
||
|
zI(op_SVC, uint32(p.From.Offset), asm)
|
||
|
}
|
||
|
|
||
|
case 78: // undef
|
||
|
// "An instruction consisting entirely of binary 0s is guaranteed
|
||
|
// always to be an illegal instruction."
|
||
|
*asm = append(*asm, 0, 0, 0, 0)
|
||
|
|
||
|
case 79: // compare and swap reg reg reg
|
||
|
v := c.regoff(&p.To)
|
||
|
if v < 0 {
|
||
|
v = 0
|
||
|
}
|
||
|
if p.As == ACS {
|
||
|
zRS(op_CS, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
|
||
|
} else if p.As == ACSG {
|
||
|
zRSY(op_CSG, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
|
||
|
}
|
||
|
|
||
|
case 80: // sync
|
||
|
zRR(op_BCR, uint32(NotEqual), 0, asm)
|
||
|
|
||
|
case 81: // float to fixed and fixed to float moves (no conversion)
|
||
|
switch p.As {
|
||
|
case ALDGR:
|
||
|
zRRE(op_LDGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
case ALGDR:
|
||
|
zRRE(op_LGDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
}
|
||
|
|
||
|
case 82: // fixed to float conversion
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
log.Fatalf("unexpected opcode %v", p.As)
|
||
|
case ACEFBRA:
|
||
|
opcode = op_CEFBRA
|
||
|
case ACDFBRA:
|
||
|
opcode = op_CDFBRA
|
||
|
case ACEGBRA:
|
||
|
opcode = op_CEGBRA
|
||
|
case ACDGBRA:
|
||
|
opcode = op_CDGBRA
|
||
|
case ACELFBR:
|
||
|
opcode = op_CELFBR
|
||
|
case ACDLFBR:
|
||
|
opcode = op_CDLFBR
|
||
|
case ACELGBR:
|
||
|
opcode = op_CELGBR
|
||
|
case ACDLGBR:
|
||
|
opcode = op_CDLGBR
|
||
|
}
|
||
|
// set immediate operand M3 to 0 to use the default BFP rounding mode
|
||
|
// (usually round to nearest, ties to even)
|
||
|
// TODO(mundaym): should this be fixed at round to nearest, ties to even?
|
||
|
// M4 is reserved and must be 0
|
||
|
zRRF(opcode, 0, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 83: // float to fixed conversion
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
log.Fatalf("unexpected opcode %v", p.As)
|
||
|
case ACFEBRA:
|
||
|
opcode = op_CFEBRA
|
||
|
case ACFDBRA:
|
||
|
opcode = op_CFDBRA
|
||
|
case ACGEBRA:
|
||
|
opcode = op_CGEBRA
|
||
|
case ACGDBRA:
|
||
|
opcode = op_CGDBRA
|
||
|
case ACLFEBR:
|
||
|
opcode = op_CLFEBR
|
||
|
case ACLFDBR:
|
||
|
opcode = op_CLFDBR
|
||
|
case ACLGEBR:
|
||
|
opcode = op_CLGEBR
|
||
|
case ACLGDBR:
|
||
|
opcode = op_CLGDBR
|
||
|
}
|
||
|
// set immediate operand M3 to 5 for rounding toward zero (required by Go spec)
|
||
|
// M4 is reserved and must be 0
|
||
|
zRRF(opcode, 5, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
|
||
|
|
||
|
case 84: // storage-and-storage operations $length mem mem
|
||
|
l := c.regoff(&p.From)
|
||
|
if l < 1 || l > 256 {
|
||
|
c.ctxt.Diag("number of bytes (%v) not in range [1,256]", l)
|
||
|
}
|
||
|
if p.GetFrom3().Index != 0 || p.To.Index != 0 {
|
||
|
c.ctxt.Diag("cannot use index reg")
|
||
|
}
|
||
|
b1 := p.To.Reg
|
||
|
b2 := p.GetFrom3().Reg
|
||
|
if b1 == 0 {
|
||
|
b1 = REGSP
|
||
|
}
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
d1 := c.regoff(&p.To)
|
||
|
d2 := c.regoff(p.GetFrom3())
|
||
|
if d1 < 0 || d1 >= DISP12 {
|
||
|
if b2 == int16(regtmp(p)) {
|
||
|
c.ctxt.Diag("regtmp(p) conflict")
|
||
|
}
|
||
|
if b1 != int16(regtmp(p)) {
|
||
|
zRRE(op_LGR, regtmp(p), uint32(b1), asm)
|
||
|
}
|
||
|
zRIL(_a, op_AGFI, regtmp(p), uint32(d1), asm)
|
||
|
if d1 == d2 && b1 == b2 {
|
||
|
d2 = 0
|
||
|
b2 = int16(regtmp(p))
|
||
|
}
|
||
|
d1 = 0
|
||
|
b1 = int16(regtmp(p))
|
||
|
}
|
||
|
if d2 < 0 || d2 >= DISP12 {
|
||
|
if b1 == REGTMP2 {
|
||
|
c.ctxt.Diag("REGTMP2 conflict")
|
||
|
}
|
||
|
if b2 != REGTMP2 {
|
||
|
zRRE(op_LGR, REGTMP2, uint32(b2), asm)
|
||
|
}
|
||
|
zRIL(_a, op_AGFI, REGTMP2, uint32(d2), asm)
|
||
|
d2 = 0
|
||
|
b2 = REGTMP2
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
default:
|
||
|
c.ctxt.Diag("unexpected opcode %v", p.As)
|
||
|
case AMVC:
|
||
|
opcode = op_MVC
|
||
|
case AMVCIN:
|
||
|
opcode = op_MVCIN
|
||
|
case ACLC:
|
||
|
opcode = op_CLC
|
||
|
// swap operand order for CLC so that it matches CMP
|
||
|
b1, b2 = b2, b1
|
||
|
d1, d2 = d2, d1
|
||
|
case AXC:
|
||
|
opcode = op_XC
|
||
|
case AOC:
|
||
|
opcode = op_OC
|
||
|
case ANC:
|
||
|
opcode = op_NC
|
||
|
}
|
||
|
zSS(_a, opcode, uint32(l-1), 0, uint32(b1), uint32(d1), uint32(b2), uint32(d2), asm)
|
||
|
|
||
|
case 85: // load address relative long
|
||
|
v := c.regoff(&p.From)
|
||
|
if p.From.Sym == nil {
|
||
|
if (v & 1) != 0 {
|
||
|
c.ctxt.Diag("cannot use LARL with odd offset: %v", v)
|
||
|
}
|
||
|
} else {
|
||
|
c.addrilreloc(p.From.Sym, int64(v))
|
||
|
v = 0
|
||
|
}
|
||
|
zRIL(_b, op_LARL, uint32(p.To.Reg), uint32(v>>1), asm)
|
||
|
|
||
|
case 86: // load address
|
||
|
d := c.vregoff(&p.From)
|
||
|
x := p.From.Index
|
||
|
b := p.From.Reg
|
||
|
if b == 0 {
|
||
|
b = REGSP
|
||
|
}
|
||
|
switch p.As {
|
||
|
case ALA:
|
||
|
zRX(op_LA, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
|
||
|
case ALAY:
|
||
|
zRXY(op_LAY, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
|
||
|
}
|
||
|
|
||
|
case 87: // execute relative long
|
||
|
v := c.vregoff(&p.From)
|
||
|
if p.From.Sym == nil {
|
||
|
if v&1 != 0 {
|
||
|
c.ctxt.Diag("cannot use EXRL with odd offset: %v", v)
|
||
|
}
|
||
|
} else {
|
||
|
c.addrilreloc(p.From.Sym, v)
|
||
|
v = 0
|
||
|
}
|
||
|
zRIL(_b, op_EXRL, uint32(p.To.Reg), uint32(v>>1), asm)
|
||
|
|
||
|
case 88: // store clock
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ASTCK:
|
||
|
opcode = op_STCK
|
||
|
case ASTCKC:
|
||
|
opcode = op_STCKC
|
||
|
case ASTCKE:
|
||
|
opcode = op_STCKE
|
||
|
case ASTCKF:
|
||
|
opcode = op_STCKF
|
||
|
}
|
||
|
v := c.vregoff(&p.To)
|
||
|
r := p.To.Reg
|
||
|
if r == 0 {
|
||
|
r = REGSP
|
||
|
}
|
||
|
zS(opcode, uint32(r), uint32(v), asm)
|
||
|
|
||
|
case 89: // compare and branch reg reg
|
||
|
var v int32
|
||
|
if p.To.Target() != nil {
|
||
|
v = int32((p.To.Target().Pc - p.Pc) >> 1)
|
||
|
}
|
||
|
|
||
|
// Some instructions take a mask as the first argument.
|
||
|
r1, r2 := p.From.Reg, p.Reg
|
||
|
if p.From.Type == obj.TYPE_CONST {
|
||
|
r1, r2 = p.Reg, p.RestArgs[0].Reg
|
||
|
}
|
||
|
m3 := uint32(c.branchMask(p))
|
||
|
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ACRJ:
|
||
|
// COMPARE AND BRANCH RELATIVE (32)
|
||
|
opcode = op_CRJ
|
||
|
case ACGRJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
|
||
|
// COMPARE AND BRANCH RELATIVE (64)
|
||
|
opcode = op_CGRJ
|
||
|
case ACLRJ:
|
||
|
// COMPARE LOGICAL AND BRANCH RELATIVE (32)
|
||
|
opcode = op_CLRJ
|
||
|
case ACLGRJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
|
||
|
// COMPARE LOGICAL AND BRANCH RELATIVE (64)
|
||
|
opcode = op_CLGRJ
|
||
|
}
|
||
|
|
||
|
if int32(int16(v)) != v {
|
||
|
// The branch is too far for one instruction so crack
|
||
|
// `CMPBEQ x, y, target` into:
|
||
|
//
|
||
|
// CMPBNE x, y, 2(PC)
|
||
|
// BR target
|
||
|
//
|
||
|
// Note that the instruction sequence MUST NOT clobber
|
||
|
// the condition code.
|
||
|
m3 ^= 0xe // invert 3-bit mask
|
||
|
zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(sizeRIE+sizeRIL)/2, 0, 0, m3, 0, asm)
|
||
|
zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
|
||
|
} else {
|
||
|
zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(v), 0, 0, m3, 0, asm)
|
||
|
}
|
||
|
|
||
|
case 90: // compare and branch reg $constant
|
||
|
var v int32
|
||
|
if p.To.Target() != nil {
|
||
|
v = int32((p.To.Target().Pc - p.Pc) >> 1)
|
||
|
}
|
||
|
|
||
|
// Some instructions take a mask as the first argument.
|
||
|
r1, i2 := p.From.Reg, p.RestArgs[0].Offset
|
||
|
if p.From.Type == obj.TYPE_CONST {
|
||
|
r1 = p.Reg
|
||
|
}
|
||
|
m3 := uint32(c.branchMask(p))
|
||
|
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ACIJ:
|
||
|
opcode = op_CIJ
|
||
|
case ACGIJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
|
||
|
opcode = op_CGIJ
|
||
|
case ACLIJ:
|
||
|
opcode = op_CLIJ
|
||
|
case ACLGIJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
|
||
|
opcode = op_CLGIJ
|
||
|
}
|
||
|
if int32(int16(v)) != v {
|
||
|
// The branch is too far for one instruction so crack
|
||
|
// `CMPBEQ x, $0, target` into:
|
||
|
//
|
||
|
// CMPBNE x, $0, 2(PC)
|
||
|
// BR target
|
||
|
//
|
||
|
// Note that the instruction sequence MUST NOT clobber
|
||
|
// the condition code.
|
||
|
m3 ^= 0xe // invert 3-bit mask
|
||
|
zRIE(_c, opcode, uint32(r1), m3, uint32(sizeRIE+sizeRIL)/2, 0, 0, 0, uint32(i2), asm)
|
||
|
zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
|
||
|
} else {
|
||
|
zRIE(_c, opcode, uint32(r1), m3, uint32(v), 0, 0, 0, uint32(i2), asm)
|
||
|
}
|
||
|
|
||
|
case 91: // test under mask (immediate)
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ATMHH:
|
||
|
opcode = op_TMHH
|
||
|
case ATMHL:
|
||
|
opcode = op_TMHL
|
||
|
case ATMLH:
|
||
|
opcode = op_TMLH
|
||
|
case ATMLL:
|
||
|
opcode = op_TMLL
|
||
|
}
|
||
|
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
|
||
|
v := c.vregoff(&p.To)
|
||
|
if v != 0 {
|
||
|
c.ctxt.Diag("invalid offset against GOT slot %v", p)
|
||
|
}
|
||
|
zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
|
||
|
rel := obj.Addrel(c.cursym)
|
||
|
rel.Off = int32(c.pc + 2)
|
||
|
rel.Siz = 4
|
||
|
rel.Sym = p.From.Sym
|
||
|
rel.Type = objabi.R_GOTPCREL
|
||
|
rel.Add = 2 + int64(rel.Siz)
|
||
|
|
||
|
case 94: // TLS local exec model
|
||
|
zRIL(_b, op_LARL, regtmp(p), (sizeRIL+sizeRXY+sizeRI)>>1, asm)
|
||
|
zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
|
||
|
zRI(op_BRC, 0xF, (sizeRI+8)>>1, asm)
|
||
|
*asm = append(*asm, 0, 0, 0, 0, 0, 0, 0, 0)
|
||
|
rel := obj.Addrel(c.cursym)
|
||
|
rel.Off = int32(c.pc + sizeRIL + sizeRXY + sizeRI)
|
||
|
rel.Siz = 8
|
||
|
rel.Sym = p.From.Sym
|
||
|
rel.Type = objabi.R_TLS_LE
|
||
|
rel.Add = 0
|
||
|
|
||
|
case 95: // TLS initial exec model
|
||
|
// Assembly | Relocation symbol | Done Here?
|
||
|
// --------------------------------------------------------------
|
||
|
// ear %r11, %a0 | |
|
||
|
// sllg %r11, %r11, 32 | |
|
||
|
// ear %r11, %a1 | |
|
||
|
// larl %r10, <var>@indntpoff | R_390_TLS_IEENT | Y
|
||
|
// lg %r10, 0(%r10) | R_390_TLS_LOAD (tag) | Y
|
||
|
// la %r10, 0(%r10, %r11) | |
|
||
|
// --------------------------------------------------------------
|
||
|
|
||
|
// R_390_TLS_IEENT
|
||
|
zRIL(_b, op_LARL, regtmp(p), 0, asm)
|
||
|
ieent := obj.Addrel(c.cursym)
|
||
|
ieent.Off = int32(c.pc + 2)
|
||
|
ieent.Siz = 4
|
||
|
ieent.Sym = p.From.Sym
|
||
|
ieent.Type = objabi.R_TLS_IE
|
||
|
ieent.Add = 2 + int64(ieent.Siz)
|
||
|
|
||
|
// R_390_TLS_LOAD
|
||
|
zRXY(op_LGF, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
|
||
|
// TODO(mundaym): add R_390_TLS_LOAD relocation here
|
||
|
// not strictly required but might allow the linker to optimize
|
||
|
|
||
|
case 96: // clear macro
|
||
|
length := c.vregoff(&p.From)
|
||
|
offset := c.vregoff(&p.To)
|
||
|
reg := p.To.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
if length <= 0 {
|
||
|
c.ctxt.Diag("cannot CLEAR %d bytes, must be greater than 0", length)
|
||
|
}
|
||
|
for length > 0 {
|
||
|
if offset < 0 || offset >= DISP12 {
|
||
|
if offset >= -DISP20/2 && offset < DISP20/2 {
|
||
|
zRXY(op_LAY, regtmp(p), uint32(reg), 0, uint32(offset), asm)
|
||
|
} else {
|
||
|
if reg != int16(regtmp(p)) {
|
||
|
zRRE(op_LGR, regtmp(p), uint32(reg), asm)
|
||
|
}
|
||
|
zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
|
||
|
}
|
||
|
reg = int16(regtmp(p))
|
||
|
offset = 0
|
||
|
}
|
||
|
size := length
|
||
|
if size > 256 {
|
||
|
size = 256
|
||
|
}
|
||
|
|
||
|
switch size {
|
||
|
case 1:
|
||
|
zSI(op_MVI, 0, uint32(reg), uint32(offset), asm)
|
||
|
case 2:
|
||
|
zSIL(op_MVHHI, uint32(reg), uint32(offset), 0, asm)
|
||
|
case 4:
|
||
|
zSIL(op_MVHI, uint32(reg), uint32(offset), 0, asm)
|
||
|
case 8:
|
||
|
zSIL(op_MVGHI, uint32(reg), uint32(offset), 0, asm)
|
||
|
default:
|
||
|
zSS(_a, op_XC, uint32(size-1), 0, uint32(reg), uint32(offset), uint32(reg), uint32(offset), asm)
|
||
|
}
|
||
|
|
||
|
length -= size
|
||
|
offset += size
|
||
|
}
|
||
|
|
||
|
case 97: // store multiple
|
||
|
rstart := p.From.Reg
|
||
|
rend := p.Reg
|
||
|
offset := c.regoff(&p.To)
|
||
|
reg := p.To.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
if offset < -DISP20/2 || offset >= DISP20/2 {
|
||
|
if reg != int16(regtmp(p)) {
|
||
|
zRRE(op_LGR, regtmp(p), uint32(reg), asm)
|
||
|
}
|
||
|
zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
|
||
|
reg = int16(regtmp(p))
|
||
|
offset = 0
|
||
|
}
|
||
|
switch p.As {
|
||
|
case ASTMY:
|
||
|
if offset >= 0 && offset < DISP12 {
|
||
|
zRS(op_STM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
} else {
|
||
|
zRSY(op_STMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
}
|
||
|
case ASTMG:
|
||
|
zRSY(op_STMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
}
|
||
|
|
||
|
case 98: // load multiple
|
||
|
rstart := p.Reg
|
||
|
rend := p.To.Reg
|
||
|
offset := c.regoff(&p.From)
|
||
|
reg := p.From.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
if offset < -DISP20/2 || offset >= DISP20/2 {
|
||
|
if reg != int16(regtmp(p)) {
|
||
|
zRRE(op_LGR, regtmp(p), uint32(reg), asm)
|
||
|
}
|
||
|
zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
|
||
|
reg = int16(regtmp(p))
|
||
|
offset = 0
|
||
|
}
|
||
|
switch p.As {
|
||
|
case ALMY:
|
||
|
if offset >= 0 && offset < DISP12 {
|
||
|
zRS(op_LM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
} else {
|
||
|
zRSY(op_LMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
}
|
||
|
case ALMG:
|
||
|
zRSY(op_LMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
|
||
|
}
|
||
|
|
||
|
case 99: // interlocked load and op
|
||
|
if p.To.Index != 0 {
|
||
|
c.ctxt.Diag("cannot use indexed address")
|
||
|
}
|
||
|
offset := c.regoff(&p.To)
|
||
|
if offset < -DISP20/2 || offset >= DISP20/2 {
|
||
|
c.ctxt.Diag("%v does not fit into 20-bit signed integer", offset)
|
||
|
}
|
||
|
var opcode uint32
|
||
|
switch p.As {
|
||
|
case ALAA:
|
||
|
opcode = op_LAA
|
||
|
case ALAAG:
|
||
|
opcode = op_LAAG
|
||
|
case ALAAL:
|
||
|
opcode = op_LAAL
|
||
|
case ALAALG:
|
||
|
opcode = op_LAALG
|
||
|
case ALAN:
|
||
|
opcode = op_LAN
|
||
|
case ALANG:
|
||
|
opcode = op_LANG
|
||
|
case ALAX:
|
||
|
opcode = op_LAX
|
||
|
case ALAXG:
|
||
|
opcode = op_LAXG
|
||
|
case ALAO:
|
||
|
opcode = op_LAO
|
||
|
case ALAOG:
|
||
|
opcode = op_LAOG
|
||
|
}
|
||
|
zRSY(opcode, uint32(p.Reg), uint32(p.From.Reg), uint32(p.To.Reg), uint32(offset), asm)
|
||
|
|
||
|
case 100: // VRX STORE
|
||
|
op, m3, _ := vop(p.As)
|
||
|
v1 := p.From.Reg
|
||
|
if p.Reg != 0 {
|
||
|
m3 = uint32(c.vregoff(&p.From))
|
||
|
v1 = p.Reg
|
||
|
}
|
||
|
b2 := p.To.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
d2 := uint32(c.vregoff(&p.To))
|
||
|
zVRX(op, uint32(v1), uint32(p.To.Index), uint32(b2), d2, m3, asm)
|
||
|
|
||
|
case 101: // VRX LOAD
|
||
|
op, m3, _ := vop(p.As)
|
||
|
src := &p.From
|
||
|
if p.GetFrom3() != nil {
|
||
|
m3 = uint32(c.vregoff(&p.From))
|
||
|
src = p.GetFrom3()
|
||
|
}
|
||
|
b2 := src.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
d2 := uint32(c.vregoff(src))
|
||
|
zVRX(op, uint32(p.To.Reg), uint32(src.Index), uint32(b2), d2, m3, asm)
|
||
|
|
||
|
case 102: // VRV SCATTER
|
||
|
op, _, _ := vop(p.As)
|
||
|
m3 := uint32(c.vregoff(&p.From))
|
||
|
b2 := p.To.Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
d2 := uint32(c.vregoff(&p.To))
|
||
|
zVRV(op, uint32(p.Reg), uint32(p.To.Index), uint32(b2), d2, m3, asm)
|
||
|
|
||
|
case 103: // VRV GATHER
|
||
|
op, _, _ := vop(p.As)
|
||
|
m3 := uint32(c.vregoff(&p.From))
|
||
|
b2 := p.GetFrom3().Reg
|
||
|
if b2 == 0 {
|
||
|
b2 = REGSP
|
||
|
}
|
||
|
d2 := uint32(c.vregoff(p.GetFrom3()))
|
||
|
zVRV(op, uint32(p.To.Reg), uint32(p.GetFrom3().Index), uint32(b2), d2, m3, asm)
|
||
|
|
||
|
case 104: // VRS SHIFT/ROTATE and LOAD GR FROM VR ELEMENT
|
||
|
op, m4, _ := vop(p.As)
|
||
|
fr := p.Reg
|
||
|
if fr == 0 {
|
||
|
fr = p.To.Reg
|
||
|
}
|
||
|
bits := uint32(c.vregoff(&p.From))
|
||
|
zVRS(op, uint32(p.To.Reg), uint32(fr), uint32(p.From.Reg), bits, m4, asm)
|
||
|
|
||
|
case 105: // VRS STORE MULTIPLE
|
||
|
op, _, _ := vop(p.As)
|
||
|
offset := uint32(c.vregoff(&p.To))
|
||
|
reg := p.To.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
zVRS(op, uint32(p.From.Reg), uint32(p.Reg), uint32(reg), offset, 0, asm)
|
||
|
|
||
|
case 106: // VRS LOAD MULTIPLE
|
||
|
op, _, _ := vop(p.As)
|
||
|
offset := uint32(c.vregoff(&p.From))
|
||
|
reg := p.From.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
zVRS(op, uint32(p.Reg), uint32(p.To.Reg), uint32(reg), offset, 0, asm)
|
||
|
|
||
|
case 107: // VRS STORE WITH LENGTH
|
||
|
op, _, _ := vop(p.As)
|
||
|
offset := uint32(c.vregoff(&p.To))
|
||
|
reg := p.To.Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
zVRS(op, uint32(p.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
|
||
|
|
||
|
case 108: // VRS LOAD WITH LENGTH
|
||
|
op, _, _ := vop(p.As)
|
||
|
offset := uint32(c.vregoff(p.GetFrom3()))
|
||
|
reg := p.GetFrom3().Reg
|
||
|
if reg == 0 {
|
||
|
reg = REGSP
|
||
|
}
|
||
|
zVRS(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
|
||
|
|
||
|
case 109: // VRI-a
|
||
|
op, m3, _ := vop(p.As)
|
||
|
i2 := uint32(c.vregoff(&p.From))
|
||
|
if p.GetFrom3() != nil {
|
||
|
m3 = uint32(c.vregoff(&p.From))
|
||
|
i2 = uint32(c.vregoff(p.GetFrom3()))
|
||
|
}
|
||
|
switch p.As {
|
||
|
case AVZERO:
|
||
|
i2 = 0
|
||
|
case AVONE:
|
||
|
i2 = 0xffff
|
||
|
}
|
||
|
zVRIa(op, uint32(p.To.Reg), i2, m3, asm)
|
||
|
|
||
|
case 110:
|
||
|
op, m4, _ := vop(p.As)
|
||
|
i2 := uint32(c.vregoff(&p.From))
|
||
|
i3 := uint32(c.vregoff(p.GetFrom3()))
|
||
|
zVRIb(op, uint32(p.To.Reg), i2, i3, m4, asm)
|
||
|
|
||
|
case 111:
|
||
|
op, m4, _ := vop(p.As)
|
||
|
i2 := uint32(c.vregoff(&p.From))
|
||
|
zVRIc(op, uint32(p.To.Reg), uint32(p.Reg), i2, m4, asm)
|
||
|
|
||
|
case 112:
|
||
|
op, m5, _ := vop(p.As)
|
||
|
i4 := uint32(c.vregoff(&p.From))
|
||
|
zVRId(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), i4, m5, asm)
|
||
|
|
||
|
case 113:
|
||
|
op, m4, _ := vop(p.As)
|
||
|
m5 := singleElementMask(p.As)
|
||
|
i3 := uint32(c.vregoff(&p.From))
|
||
|
zVRIe(op, uint32(p.To.Reg), uint32(p.Reg), i3, m5, m4, asm)
|
||
|
|
||
|
case 114: // VRR-a
|
||
|
op, m3, m5 := vop(p.As)
|
||
|
m4 := singleElementMask(p.As)
|
||
|
zVRRa(op, uint32(p.To.Reg), uint32(p.From.Reg), m5, m4, m3, asm)
|
||
|
|
||
|
case 115: // VRR-a COMPARE
|
||
|
op, m3, m5 := vop(p.As)
|
||
|
m4 := singleElementMask(p.As)
|
||
|
zVRRa(op, uint32(p.From.Reg), uint32(p.To.Reg), m5, m4, m3, asm)
|
||
|
|
||
|
case 117: // VRR-b
|
||
|
op, m4, m5 := vop(p.As)
|
||
|
zVRRb(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), m5, m4, asm)
|
||
|
|
||
|
case 118: // VRR-c
|
||
|
op, m4, m6 := vop(p.As)
|
||
|
m5 := singleElementMask(p.As)
|
||
|
v3 := p.Reg
|
||
|
if v3 == 0 {
|
||
|
v3 = p.To.Reg
|
||
|
}
|
||
|
zVRRc(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(v3), m6, m5, m4, asm)
|
||
|
|
||
|
case 119: // VRR-c SHIFT/ROTATE/DIVIDE/SUB (rhs value on the left, like SLD, DIV etc.)
|
||
|
op, m4, m6 := vop(p.As)
|
||
|
m5 := singleElementMask(p.As)
|
||
|
v2 := p.Reg
|
||
|
if v2 == 0 {
|
||
|
v2 = p.To.Reg
|
||
|
}
|
||
|
zVRRc(op, uint32(p.To.Reg), uint32(v2), uint32(p.From.Reg), m6, m5, m4, asm)
|
||
|
|
||
|
case 120: // VRR-d
|
||
|
op, m6, _ := vop(p.As)
|
||
|
m5 := singleElementMask(p.As)
|
||
|
v1 := uint32(p.To.Reg)
|
||
|
v2 := uint32(p.From.Reg)
|
||
|
v3 := uint32(p.Reg)
|
||
|
v4 := uint32(p.GetFrom3().Reg)
|
||
|
zVRRd(op, v1, v2, v3, m6, m5, v4, asm)
|
||
|
|
||
|
case 121: // VRR-e
|
||
|
op, m6, _ := vop(p.As)
|
||
|
m5 := singleElementMask(p.As)
|
||
|
v1 := uint32(p.To.Reg)
|
||
|
v2 := uint32(p.From.Reg)
|
||
|
v3 := uint32(p.Reg)
|
||
|
v4 := uint32(p.GetFrom3().Reg)
|
||
|
zVRRe(op, v1, v2, v3, m6, m5, v4, asm)
|
||
|
|
||
|
case 122: // VRR-f LOAD VRS FROM GRS DISJOINT
|
||
|
op, _, _ := vop(p.As)
|
||
|
zVRRf(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
|
||
|
|
||
|
case 123: // VPDI $m4, V2, V3, V1
|
||
|
op, _, _ := vop(p.As)
|
||
|
m4 := c.regoff(&p.From)
|
||
|
zVRRc(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), 0, 0, uint32(m4), asm)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) vregoff(a *obj.Addr) int64 {
|
||
|
c.instoffset = 0
|
||
|
if a != nil {
|
||
|
c.aclass(a)
|
||
|
}
|
||
|
return c.instoffset
|
||
|
}
|
||
|
|
||
|
func (c *ctxtz) regoff(a *obj.Addr) int32 {
|
||
|
return int32(c.vregoff(a))
|
||
|
}
|
||
|
|
||
|
// find if the displacement is within 12 bit
|
||
|
func isU12(displacement int32) bool {
|
||
|
return displacement >= 0 && displacement < DISP12
|
||
|
}
|
||
|
|
||
|
// zopload12 returns the RX op with 12 bit displacement for the given load
|
||
|
func (c *ctxtz) zopload12(a obj.As) (uint32, bool) {
|
||
|
switch a {
|
||
|
case AFMOVD:
|
||
|
return op_LD, true
|
||
|
case AFMOVS:
|
||
|
return op_LE, true
|
||
|
}
|
||
|
return 0, false
|
||
|
}
|
||
|
|
||
|
// zopload returns the RXY op for the given load
|
||
|
func (c *ctxtz) zopload(a obj.As) uint32 {
|
||
|
switch a {
|
||
|
// fixed point load
|
||
|
case AMOVD:
|
||
|
return op_LG
|
||
|
case AMOVW:
|
||
|
return op_LGF
|
||
|
case AMOVWZ:
|
||
|
return op_LLGF
|
||
|
case AMOVH:
|
||
|
return op_LGH
|
||
|
case AMOVHZ:
|
||
|
return op_LLGH
|
||
|
case AMOVB:
|
||
|
return op_LGB
|
||
|
case AMOVBZ:
|
||
|
return op_LLGC
|
||
|
|
||
|
// floating point load
|
||
|
case AFMOVD:
|
||
|
return op_LDY
|
||
|
case AFMOVS:
|
||
|
return op_LEY
|
||
|
|
||
|
// byte reversed load
|
||
|
case AMOVDBR:
|
||
|
return op_LRVG
|
||
|
case AMOVWBR:
|
||
|
return op_LRV
|
||
|
case AMOVHBR:
|
||
|
return op_LRVH
|
||
|
}
|
||
|
|
||
|
c.ctxt.Diag("unknown store opcode %v", a)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
// zopstore12 returns the RX op with 12 bit displacement for the given store
|
||
|
func (c *ctxtz) zopstore12(a obj.As) (uint32, bool) {
|
||
|
switch a {
|
||
|
case AFMOVD:
|
||
|
return op_STD, true
|
||
|
case AFMOVS:
|
||
|
return op_STE, true
|
||
|
case AMOVW, AMOVWZ:
|
||
|
return op_ST, true
|
||
|
case AMOVH, AMOVHZ:
|
||
|
return op_STH, true
|
||
|
case AMOVB, AMOVBZ:
|
||
|
return op_STC, true
|
||
|
}
|
||
|
return 0, false
|
||
|
}
|
||
|
|
||
|
// zopstore returns the RXY op for the given store
|
||
|
func (c *ctxtz) zopstore(a obj.As) uint32 {
|
||
|
switch a {
|
||
|
// fixed point store
|
||
|
case AMOVD:
|
||
|
return op_STG
|
||
|
case AMOVW, AMOVWZ:
|
||
|
return op_STY
|
||
|
case AMOVH, AMOVHZ:
|
||
|
return op_STHY
|
||
|
case AMOVB, AMOVBZ:
|
||
|
return op_STCY
|
||
|
|
||
|
// floating point store
|
||
|
case AFMOVD:
|
||
|
return op_STDY
|
||
|
case AFMOVS:
|
||
|
return op_STEY
|
||
|
|
||
|
// byte reversed store
|
||
|
case AMOVDBR:
|
||
|
return op_STRVG
|
||
|
case AMOVWBR:
|
||
|
return op_STRV
|
||
|
case AMOVHBR:
|
||
|
return op_STRVH
|
||
|
}
|
||
|
|
||
|
c.ctxt.Diag("unknown store opcode %v", a)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
// zoprre returns the RRE op for the given a
|
||
|
func (c *ctxtz) zoprre(a obj.As) uint32 {
|
||
|
switch a {
|
||
|
case ACMP:
|
||
|
return op_CGR
|
||
|
case ACMPU:
|
||
|
return op_CLGR
|
||
|
case AFCMPO: //ordered
|
||
|
return op_KDBR
|
||
|
case AFCMPU: //unordered
|
||
|
return op_CDBR
|
||
|
case ACEBR:
|
||
|
return op_CEBR
|
||
|
}
|
||
|
c.ctxt.Diag("unknown rre opcode %v", a)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
// zoprr returns the RR op for the given a
|
||
|
func (c *ctxtz) zoprr(a obj.As) uint32 {
|
||
|
switch a {
|
||
|
case ACMPW:
|
||
|
return op_CR
|
||
|
case ACMPWU:
|
||
|
return op_CLR
|
||
|
}
|
||
|
c.ctxt.Diag("unknown rr opcode %v", a)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
// zopril returns the RIL op for the given a
|
||
|
func (c *ctxtz) zopril(a obj.As) uint32 {
|
||
|
switch a {
|
||
|
case ACMP:
|
||
|
return op_CGFI
|
||
|
case ACMPU:
|
||
|
return op_CLGFI
|
||
|
case ACMPW:
|
||
|
return op_CFI
|
||
|
case ACMPWU:
|
||
|
return op_CLFI
|
||
|
}
|
||
|
c.ctxt.Diag("unknown ril opcode %v", a)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
// z instructions sizes
|
||
|
const (
|
||
|
sizeE = 2
|
||
|
sizeI = 2
|
||
|
sizeIE = 4
|
||
|
sizeMII = 6
|
||
|
sizeRI = 4
|
||
|
sizeRI1 = 4
|
||
|
sizeRI2 = 4
|
||
|
sizeRI3 = 4
|
||
|
sizeRIE = 6
|
||
|
sizeRIE1 = 6
|
||
|
sizeRIE2 = 6
|
||
|
sizeRIE3 = 6
|
||
|
sizeRIE4 = 6
|
||
|
sizeRIE5 = 6
|
||
|
sizeRIE6 = 6
|
||
|
sizeRIL = 6
|
||
|
sizeRIL1 = 6
|
||
|
sizeRIL2 = 6
|
||
|
sizeRIL3 = 6
|
||
|
sizeRIS = 6
|
||
|
sizeRR = 2
|
||
|
sizeRRD = 4
|
||
|
sizeRRE = 4
|
||
|
sizeRRF = 4
|
||
|
sizeRRF1 = 4
|
||
|
sizeRRF2 = 4
|
||
|
sizeRRF3 = 4
|
||
|
sizeRRF4 = 4
|
||
|
sizeRRF5 = 4
|
||
|
sizeRRR = 2
|
||
|
sizeRRS = 6
|
||
|
sizeRS = 4
|
||
|
sizeRS1 = 4
|
||
|
sizeRS2 = 4
|
||
|
sizeRSI = 4
|
||
|
sizeRSL = 6
|
||
|
sizeRSY = 6
|
||
|
sizeRSY1 = 6
|
||
|
sizeRSY2 = 6
|
||
|
sizeRX = 4
|
||
|
sizeRX1 = 4
|
||
|
sizeRX2 = 4
|
||
|
sizeRXE = 6
|
||
|
sizeRXF = 6
|
||
|
sizeRXY = 6
|
||
|
sizeRXY1 = 6
|
||
|
sizeRXY2 = 6
|
||
|
sizeS = 4
|
||
|
sizeSI = 4
|
||
|
sizeSIL = 6
|
||
|
sizeSIY = 6
|
||
|
sizeSMI = 6
|
||
|
sizeSS = 6
|
||
|
sizeSS1 = 6
|
||
|
sizeSS2 = 6
|
||
|
sizeSS3 = 6
|
||
|
sizeSS4 = 6
|
||
|
sizeSS5 = 6
|
||
|
sizeSS6 = 6
|
||
|
sizeSSE = 6
|
||
|
sizeSSF = 6
|
||
|
)
|
||
|
|
||
|
// instruction format variations
|
||
|
type form int
|
||
|
|
||
|
const (
|
||
|
_a form = iota
|
||
|
_b
|
||
|
_c
|
||
|
_d
|
||
|
_e
|
||
|
_f
|
||
|
)
|
||
|
|
||
|
func zE(op uint32, asm *[]byte) {
|
||
|
*asm = append(*asm, uint8(op>>8), uint8(op))
|
||
|
}
|
||
|
|
||
|
func zI(op, i1 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm, uint8(op>>8), uint8(i1))
|
||
|
}
|
||
|
|
||
|
func zMII(op, m1, ri2, ri3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(m1)<<4)|uint8((ri2>>8)&0x0F),
|
||
|
uint8(ri2),
|
||
|
uint8(ri3>>16),
|
||
|
uint8(ri3>>8),
|
||
|
uint8(ri3))
|
||
|
}
|
||
|
|
||
|
func zRI(op, r1_m1, i2_ri2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1_m1)<<4)|(uint8(op)&0x0F),
|
||
|
uint8(i2_ri2>>8),
|
||
|
uint8(i2_ri2))
|
||
|
}
|
||
|
|
||
|
// Expected argument values for the instruction formats.
|
||
|
//
|
||
|
// Format a1 a2 a3 a4 a5 a6 a7
|
||
|
// ------------------------------------
|
||
|
// a r1, 0, i2, 0, 0, m3, 0
|
||
|
// b r1, r2, ri4, 0, 0, m3, 0
|
||
|
// c r1, m3, ri4, 0, 0, 0, i2
|
||
|
// d r1, r3, i2, 0, 0, 0, 0
|
||
|
// e r1, r3, ri2, 0, 0, 0, 0
|
||
|
// f r1, r2, 0, i3, i4, 0, i5
|
||
|
// g r1, m3, i2, 0, 0, 0, 0
|
||
|
func zRIE(f form, op, r1, r2_m3_r3, i2_ri4_ri2, i3, i4, m3, i2_i5 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm, uint8(op>>8), uint8(r1)<<4|uint8(r2_m3_r3&0x0F))
|
||
|
|
||
|
switch f {
|
||
|
default:
|
||
|
*asm = append(*asm, uint8(i2_ri4_ri2>>8), uint8(i2_ri4_ri2))
|
||
|
case _f:
|
||
|
*asm = append(*asm, uint8(i3), uint8(i4))
|
||
|
}
|
||
|
|
||
|
switch f {
|
||
|
case _a, _b:
|
||
|
*asm = append(*asm, uint8(m3)<<4)
|
||
|
default:
|
||
|
*asm = append(*asm, uint8(i2_i5))
|
||
|
}
|
||
|
|
||
|
*asm = append(*asm, uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRIL(f form, op, r1_m1, i2_ri2 uint32, asm *[]byte) {
|
||
|
if f == _a || f == _b {
|
||
|
r1_m1 = r1_m1 - obj.RBaseS390X // this is a register base
|
||
|
}
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1_m1)<<4)|(uint8(op)&0x0F),
|
||
|
uint8(i2_ri2>>24),
|
||
|
uint8(i2_ri2>>16),
|
||
|
uint8(i2_ri2>>8),
|
||
|
uint8(i2_ri2))
|
||
|
}
|
||
|
|
||
|
func zRIS(op, r1, m3, b4, d4, i2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(m3&0x0F),
|
||
|
(uint8(b4)<<4)|(uint8(d4>>8)&0x0F),
|
||
|
uint8(d4),
|
||
|
uint8(i2),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRR(op, r1, r2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm, uint8(op>>8), (uint8(r1)<<4)|uint8(r2&0x0F))
|
||
|
}
|
||
|
|
||
|
func zRRD(op, r1, r3, r2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
uint8(r1)<<4,
|
||
|
(uint8(r3)<<4)|uint8(r2&0x0F))
|
||
|
}
|
||
|
|
||
|
func zRRE(op, r1, r2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
0,
|
||
|
(uint8(r1)<<4)|uint8(r2&0x0F))
|
||
|
}
|
||
|
|
||
|
func zRRF(op, r3_m3, m4, r1, r2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
(uint8(r3_m3)<<4)|uint8(m4&0x0F),
|
||
|
(uint8(r1)<<4)|uint8(r2&0x0F))
|
||
|
}
|
||
|
|
||
|
func zRRS(op, r1, r2, b4, d4, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(r2&0x0F),
|
||
|
(uint8(b4)<<4)|uint8((d4>>8)&0x0F),
|
||
|
uint8(d4),
|
||
|
uint8(m3)<<4,
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRS(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(r3_m3&0x0F),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2))
|
||
|
}
|
||
|
|
||
|
func zRSI(op, r1, r3, ri2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(r3&0x0F),
|
||
|
uint8(ri2>>8),
|
||
|
uint8(ri2))
|
||
|
}
|
||
|
|
||
|
func zRSL(op, l1, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(l1),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRSY(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
|
||
|
dl2 := uint16(d2) & 0x0FFF
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(r3_m3&0x0F),
|
||
|
(uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
|
||
|
uint8(dl2),
|
||
|
uint8(d2>>12),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRX(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1_m1)<<4)|uint8(x2&0x0F),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2))
|
||
|
}
|
||
|
|
||
|
func zRXE(op, r1, x2, b2, d2, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1)<<4)|uint8(x2&0x0F),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2),
|
||
|
uint8(m3)<<4,
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRXF(op, r3, x2, b2, d2, m1 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r3)<<4)|uint8(x2&0x0F),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2),
|
||
|
uint8(m1)<<4,
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zRXY(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
|
||
|
dl2 := uint16(d2) & 0x0FFF
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r1_m1)<<4)|uint8(x2&0x0F),
|
||
|
(uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
|
||
|
uint8(dl2),
|
||
|
uint8(d2>>12),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zS(op, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2))
|
||
|
}
|
||
|
|
||
|
func zSI(op, i2, b1, d1 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(i2),
|
||
|
(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
|
||
|
uint8(d1))
|
||
|
}
|
||
|
|
||
|
func zSIL(op, b1, d1, i2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
|
||
|
uint8(d1),
|
||
|
uint8(i2>>8),
|
||
|
uint8(i2))
|
||
|
}
|
||
|
|
||
|
func zSIY(op, i2, b1, d1 uint32, asm *[]byte) {
|
||
|
dl1 := uint16(d1) & 0x0FFF
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(i2),
|
||
|
(uint8(b1)<<4)|(uint8(dl1>>8)&0x0F),
|
||
|
uint8(dl1),
|
||
|
uint8(d1>>12),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zSMI(op, m1, b3, d3, ri2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(m1)<<4,
|
||
|
(uint8(b3)<<4)|uint8((d3>>8)&0x0F),
|
||
|
uint8(d3),
|
||
|
uint8(ri2>>8),
|
||
|
uint8(ri2))
|
||
|
}
|
||
|
|
||
|
// Expected argument values for the instruction formats.
|
||
|
//
|
||
|
// Format a1 a2 a3 a4 a5 a6
|
||
|
// -------------------------------
|
||
|
// a l1, 0, b1, d1, b2, d2
|
||
|
// b l1, l2, b1, d1, b2, d2
|
||
|
// c l1, i3, b1, d1, b2, d2
|
||
|
// d r1, r3, b1, d1, b2, d2
|
||
|
// e r1, r3, b2, d2, b4, d4
|
||
|
// f 0, l2, b1, d1, b2, d2
|
||
|
func zSS(f form, op, l1_r1, l2_i3_r3, b1_b2, d1_d2, b2_b4, d2_d4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm, uint8(op>>8))
|
||
|
|
||
|
switch f {
|
||
|
case _a:
|
||
|
*asm = append(*asm, uint8(l1_r1))
|
||
|
case _b, _c, _d, _e:
|
||
|
*asm = append(*asm, (uint8(l1_r1)<<4)|uint8(l2_i3_r3&0x0F))
|
||
|
case _f:
|
||
|
*asm = append(*asm, uint8(l2_i3_r3))
|
||
|
}
|
||
|
|
||
|
*asm = append(*asm,
|
||
|
(uint8(b1_b2)<<4)|uint8((d1_d2>>8)&0x0F),
|
||
|
uint8(d1_d2),
|
||
|
(uint8(b2_b4)<<4)|uint8((d2_d4>>8)&0x0F),
|
||
|
uint8(d2_d4))
|
||
|
}
|
||
|
|
||
|
func zSSE(op, b1, d1, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(op),
|
||
|
(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
|
||
|
uint8(d1),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2))
|
||
|
}
|
||
|
|
||
|
func zSSF(op, r3, b1, d1, b2, d2 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(r3)<<4)|(uint8(op)&0x0F),
|
||
|
(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
|
||
|
uint8(d1),
|
||
|
(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
|
||
|
uint8(d2))
|
||
|
}
|
||
|
|
||
|
func rxb(va, vb, vc, vd uint32) uint8 {
|
||
|
mask := uint8(0)
|
||
|
if va >= REG_V16 && va <= REG_V31 {
|
||
|
mask |= 0x8
|
||
|
}
|
||
|
if vb >= REG_V16 && vb <= REG_V31 {
|
||
|
mask |= 0x4
|
||
|
}
|
||
|
if vc >= REG_V16 && vc <= REG_V31 {
|
||
|
mask |= 0x2
|
||
|
}
|
||
|
if vd >= REG_V16 && vd <= REG_V31 {
|
||
|
mask |= 0x1
|
||
|
}
|
||
|
return mask
|
||
|
}
|
||
|
|
||
|
func zVRX(op, v1, x2, b2, d2, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(x2)&0xf),
|
||
|
(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
|
||
|
uint8(d2),
|
||
|
(uint8(m3)<<4)|rxb(v1, 0, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRV(op, v1, v2, b2, d2, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
|
||
|
uint8(d2),
|
||
|
(uint8(m3)<<4)|rxb(v1, v2, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRS(op, v1, v3_r3, b2, d2, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v3_r3)&0xf),
|
||
|
(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
|
||
|
uint8(d2),
|
||
|
(uint8(m4)<<4)|rxb(v1, v3_r3, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRa(op, v1, v2, m5, m4, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
0,
|
||
|
(uint8(m5)<<4)|(uint8(m4)&0xf),
|
||
|
(uint8(m3)<<4)|rxb(v1, v2, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRb(op, v1, v2, v3, m5, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
uint8(v3)<<4,
|
||
|
uint8(m5)<<4,
|
||
|
(uint8(m4)<<4)|rxb(v1, v2, v3, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRc(op, v1, v2, v3, m6, m5, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
uint8(v3)<<4,
|
||
|
(uint8(m6)<<4)|(uint8(m5)&0xf),
|
||
|
(uint8(m4)<<4)|rxb(v1, v2, v3, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRd(op, v1, v2, v3, m5, m6, v4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
(uint8(v3)<<4)|(uint8(m5)&0xf),
|
||
|
uint8(m6)<<4,
|
||
|
(uint8(v4)<<4)|rxb(v1, v2, v3, v4),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRe(op, v1, v2, v3, m6, m5, v4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
(uint8(v3)<<4)|(uint8(m6)&0xf),
|
||
|
uint8(m5),
|
||
|
(uint8(v4)<<4)|rxb(v1, v2, v3, v4),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRRf(op, v1, r2, r3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(r2)&0xf),
|
||
|
uint8(r3)<<4,
|
||
|
0,
|
||
|
rxb(v1, 0, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRIa(op, v1, i2, m3 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(v1)<<4,
|
||
|
uint8(i2>>8),
|
||
|
uint8(i2),
|
||
|
(uint8(m3)<<4)|rxb(v1, 0, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRIb(op, v1, i2, i3, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
uint8(v1)<<4,
|
||
|
uint8(i2),
|
||
|
uint8(i3),
|
||
|
(uint8(m4)<<4)|rxb(v1, 0, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRIc(op, v1, v3, i2, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v3)&0xf),
|
||
|
uint8(i2>>8),
|
||
|
uint8(i2),
|
||
|
(uint8(m4)<<4)|rxb(v1, v3, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRId(op, v1, v2, v3, i4, m5 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
uint8(v3)<<4,
|
||
|
uint8(i4),
|
||
|
(uint8(m5)<<4)|rxb(v1, v2, v3, 0),
|
||
|
uint8(op))
|
||
|
}
|
||
|
|
||
|
func zVRIe(op, v1, v2, i3, m5, m4 uint32, asm *[]byte) {
|
||
|
*asm = append(*asm,
|
||
|
uint8(op>>8),
|
||
|
(uint8(v1)<<4)|(uint8(v2)&0xf),
|
||
|
uint8(i3>>4),
|
||
|
(uint8(i3)<<4)|(uint8(m5)&0xf),
|
||
|
(uint8(m4)<<4)|rxb(v1, v2, 0, 0),
|
||
|
uint8(op))
|
||
|
}
|