blob: a20d14120afe747d90e47fd30a3a09c6a3b45ac8 [file] [log] [blame]
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"strings"
"golang.org/x/arch/x86/xeddata"
)
// argument is a describes single instruction operand properties.
type argument struct {
// ytype is argument class as returned by asm6 "oclass" function.
ytype string
// zkind is a partial Z-case matcher.
// Determines which Z-case handles the encoding of instruction.
zkind string
}
// instruction is decoded XED instruction.
// Used to produce ytabs and optabs in later phases.
type instruction struct {
// opcode is instruction symbolic name.
opcode string
pset xeddata.PatternSet
enc *encoding
// mask is EVEX K-register argument; points to args element.
// Used to emit Yk0+Yknot0 table entries.
// Nil for VEX-encoded insts.
mask *argument
args []*argument
// zform is a pattern that determines which encoder Z-case is used.
// We store zform instead of zcase directly because it's further
// expanded during optabs generation.
zform string
}
// String returns short inst printed representation.
func (inst *instruction) String() string { return inst.opcode }
// YtypeListString joins each argument Y-type and returns the result.
func (inst *instruction) YtypeListString() string {
var parts []string
for _, arg := range inst.args {
parts = append(parts, arg.ytype)
}
return strings.Join(parts, " ")
}
// ArgIndexByZkind returns first argument matching given zkind or -1.
func (inst *instruction) ArgIndexByZkind(zkind string) int {
for i, arg := range inst.args {
if arg.zkind == zkind {
return i
}
}
return -1
}