mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
https://github.com/riscv/riscv-opcodes/pull/361. After this pr was merged, riscv-opcode can generate RVV segment load/store instructions for Go. Implement vector segment load/store instuctions. Change-Id: I154bb75be70c0a45e2279a75c67f68b5bb57c36e Reviewed-on: https://go-review.googlesource.com/c/go/+/691695 Reviewed-by: Mark Freeman <markfreeman@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
1716 lines
27 KiB
Go
1716 lines
27 KiB
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.
|
|
// Portions Copyright © 2019 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 riscv
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"cmd/internal/obj"
|
|
)
|
|
|
|
var CSRs map[uint16]string = csrs
|
|
|
|
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p riscv
|
|
|
|
const (
|
|
// Base register numberings.
|
|
REG_X0 = obj.RBaseRISCV + iota
|
|
REG_X1
|
|
REG_X2
|
|
REG_X3
|
|
REG_X4
|
|
REG_X5
|
|
REG_X6
|
|
REG_X7
|
|
REG_X8
|
|
REG_X9
|
|
REG_X10
|
|
REG_X11
|
|
REG_X12
|
|
REG_X13
|
|
REG_X14
|
|
REG_X15
|
|
REG_X16
|
|
REG_X17
|
|
REG_X18
|
|
REG_X19
|
|
REG_X20
|
|
REG_X21
|
|
REG_X22
|
|
REG_X23
|
|
REG_X24
|
|
REG_X25
|
|
REG_X26
|
|
REG_X27
|
|
REG_X28
|
|
REG_X29
|
|
REG_X30
|
|
REG_X31
|
|
|
|
// Floating Point register numberings.
|
|
REG_F0
|
|
REG_F1
|
|
REG_F2
|
|
REG_F3
|
|
REG_F4
|
|
REG_F5
|
|
REG_F6
|
|
REG_F7
|
|
REG_F8
|
|
REG_F9
|
|
REG_F10
|
|
REG_F11
|
|
REG_F12
|
|
REG_F13
|
|
REG_F14
|
|
REG_F15
|
|
REG_F16
|
|
REG_F17
|
|
REG_F18
|
|
REG_F19
|
|
REG_F20
|
|
REG_F21
|
|
REG_F22
|
|
REG_F23
|
|
REG_F24
|
|
REG_F25
|
|
REG_F26
|
|
REG_F27
|
|
REG_F28
|
|
REG_F29
|
|
REG_F30
|
|
REG_F31
|
|
|
|
// Vector register numberings.
|
|
REG_V0
|
|
REG_V1
|
|
REG_V2
|
|
REG_V3
|
|
REG_V4
|
|
REG_V5
|
|
REG_V6
|
|
REG_V7
|
|
REG_V8
|
|
REG_V9
|
|
REG_V10
|
|
REG_V11
|
|
REG_V12
|
|
REG_V13
|
|
REG_V14
|
|
REG_V15
|
|
REG_V16
|
|
REG_V17
|
|
REG_V18
|
|
REG_V19
|
|
REG_V20
|
|
REG_V21
|
|
REG_V22
|
|
REG_V23
|
|
REG_V24
|
|
REG_V25
|
|
REG_V26
|
|
REG_V27
|
|
REG_V28
|
|
REG_V29
|
|
REG_V30
|
|
REG_V31
|
|
|
|
// This marks the end of the register numbering.
|
|
REG_END
|
|
|
|
// General registers reassigned to ABI names.
|
|
REG_ZERO = REG_X0
|
|
REG_RA = REG_X1 // aka REG_LR
|
|
REG_SP = REG_X2
|
|
REG_GP = REG_X3 // aka REG_SB
|
|
REG_TP = REG_X4
|
|
REG_T0 = REG_X5
|
|
REG_T1 = REG_X6
|
|
REG_T2 = REG_X7
|
|
REG_S0 = REG_X8
|
|
REG_S1 = REG_X9
|
|
REG_A0 = REG_X10
|
|
REG_A1 = REG_X11
|
|
REG_A2 = REG_X12
|
|
REG_A3 = REG_X13
|
|
REG_A4 = REG_X14
|
|
REG_A5 = REG_X15
|
|
REG_A6 = REG_X16
|
|
REG_A7 = REG_X17
|
|
REG_S2 = REG_X18
|
|
REG_S3 = REG_X19
|
|
REG_S4 = REG_X20
|
|
REG_S5 = REG_X21
|
|
REG_S6 = REG_X22
|
|
REG_S7 = REG_X23
|
|
REG_S8 = REG_X24
|
|
REG_S9 = REG_X25
|
|
REG_S10 = REG_X26 // aka REG_CTXT
|
|
REG_S11 = REG_X27 // aka REG_G
|
|
REG_T3 = REG_X28
|
|
REG_T4 = REG_X29
|
|
REG_T5 = REG_X30
|
|
REG_T6 = REG_X31 // aka REG_TMP
|
|
|
|
// Go runtime register names.
|
|
REG_CTXT = REG_S10 // Context for closures.
|
|
REG_G = REG_S11 // G pointer.
|
|
REG_LR = REG_RA // Link register.
|
|
REG_TMP = REG_T6 // Reserved for assembler use.
|
|
|
|
// ABI names for floating point registers.
|
|
REG_FT0 = REG_F0
|
|
REG_FT1 = REG_F1
|
|
REG_FT2 = REG_F2
|
|
REG_FT3 = REG_F3
|
|
REG_FT4 = REG_F4
|
|
REG_FT5 = REG_F5
|
|
REG_FT6 = REG_F6
|
|
REG_FT7 = REG_F7
|
|
REG_FS0 = REG_F8
|
|
REG_FS1 = REG_F9
|
|
REG_FA0 = REG_F10
|
|
REG_FA1 = REG_F11
|
|
REG_FA2 = REG_F12
|
|
REG_FA3 = REG_F13
|
|
REG_FA4 = REG_F14
|
|
REG_FA5 = REG_F15
|
|
REG_FA6 = REG_F16
|
|
REG_FA7 = REG_F17
|
|
REG_FS2 = REG_F18
|
|
REG_FS3 = REG_F19
|
|
REG_FS4 = REG_F20
|
|
REG_FS5 = REG_F21
|
|
REG_FS6 = REG_F22
|
|
REG_FS7 = REG_F23
|
|
REG_FS8 = REG_F24
|
|
REG_FS9 = REG_F25
|
|
REG_FS10 = REG_F26
|
|
REG_FS11 = REG_F27
|
|
REG_FT8 = REG_F28
|
|
REG_FT9 = REG_F29
|
|
REG_FT10 = REG_F30
|
|
REG_FT11 = REG_F31
|
|
|
|
// Names generated by the SSA compiler.
|
|
REGSP = REG_SP
|
|
REGG = REG_G
|
|
)
|
|
|
|
// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-dwarf.adoc#dwarf-register-numbers
|
|
var RISCV64DWARFRegisters = map[int16]int16{
|
|
// Integer Registers.
|
|
REG_X0: 0,
|
|
REG_X1: 1,
|
|
REG_X2: 2,
|
|
REG_X3: 3,
|
|
REG_X4: 4,
|
|
REG_X5: 5,
|
|
REG_X6: 6,
|
|
REG_X7: 7,
|
|
REG_X8: 8,
|
|
REG_X9: 9,
|
|
REG_X10: 10,
|
|
REG_X11: 11,
|
|
REG_X12: 12,
|
|
REG_X13: 13,
|
|
REG_X14: 14,
|
|
REG_X15: 15,
|
|
REG_X16: 16,
|
|
REG_X17: 17,
|
|
REG_X18: 18,
|
|
REG_X19: 19,
|
|
REG_X20: 20,
|
|
REG_X21: 21,
|
|
REG_X22: 22,
|
|
REG_X23: 23,
|
|
REG_X24: 24,
|
|
REG_X25: 25,
|
|
REG_X26: 26,
|
|
REG_X27: 27,
|
|
REG_X28: 28,
|
|
REG_X29: 29,
|
|
REG_X30: 30,
|
|
REG_X31: 31,
|
|
|
|
// Floating-Point Registers.
|
|
REG_F0: 32,
|
|
REG_F1: 33,
|
|
REG_F2: 34,
|
|
REG_F3: 35,
|
|
REG_F4: 36,
|
|
REG_F5: 37,
|
|
REG_F6: 38,
|
|
REG_F7: 39,
|
|
REG_F8: 40,
|
|
REG_F9: 41,
|
|
REG_F10: 42,
|
|
REG_F11: 43,
|
|
REG_F12: 44,
|
|
REG_F13: 45,
|
|
REG_F14: 46,
|
|
REG_F15: 47,
|
|
REG_F16: 48,
|
|
REG_F17: 49,
|
|
REG_F18: 50,
|
|
REG_F19: 51,
|
|
REG_F20: 52,
|
|
REG_F21: 53,
|
|
REG_F22: 54,
|
|
REG_F23: 55,
|
|
REG_F24: 56,
|
|
REG_F25: 57,
|
|
REG_F26: 58,
|
|
REG_F27: 59,
|
|
REG_F28: 60,
|
|
REG_F29: 61,
|
|
REG_F30: 62,
|
|
REG_F31: 63,
|
|
}
|
|
|
|
// Prog.Mark flags.
|
|
const (
|
|
// USES_REG_TMP indicates that a machine instruction generated from the
|
|
// corresponding *obj.Prog uses the temporary register.
|
|
USES_REG_TMP = 1 << iota
|
|
|
|
// NEED_JAL_RELOC is set on JAL instructions to indicate that a
|
|
// R_RISCV_JAL relocation is needed.
|
|
NEED_JAL_RELOC
|
|
|
|
// NEED_CALL_RELOC is set on an AUIPC instruction to indicate that it
|
|
// is the first instruction in an AUIPC + JAL pair that needs a
|
|
// R_RISCV_CALL relocation.
|
|
NEED_CALL_RELOC
|
|
|
|
// NEED_PCREL_ITYPE_RELOC is set on AUIPC instructions to indicate that
|
|
// it is the first instruction in an AUIPC + I-type pair that needs a
|
|
// R_RISCV_PCREL_ITYPE relocation.
|
|
NEED_PCREL_ITYPE_RELOC
|
|
|
|
// NEED_PCREL_STYPE_RELOC is set on AUIPC instructions to indicate that
|
|
// it is the first instruction in an AUIPC + S-type pair that needs a
|
|
// R_RISCV_PCREL_STYPE relocation.
|
|
NEED_PCREL_STYPE_RELOC
|
|
|
|
// NEED_GOT_PCREL_ITYPE_RELOC is set on AUIPC instructions to indicate that
|
|
// it is the first instruction in an AUIPC + I-type pair that needs a
|
|
// R_RISCV_GOT_PCREL_ITYPE relocation.
|
|
NEED_GOT_PCREL_ITYPE_RELOC
|
|
)
|
|
|
|
// RISC-V mnemonics, as defined in the "opcodes" and "opcodes-pseudo" files
|
|
// at https://github.com/riscv/riscv-opcodes.
|
|
//
|
|
// As well as some pseudo-mnemonics (e.g. MOV) used only in the assembler.
|
|
//
|
|
// See also "The RISC-V Instruction Set Manual" at https://riscv.org/technical/specifications/.
|
|
//
|
|
// If you modify this table, you MUST run 'go generate' to regenerate anames.go!
|
|
const (
|
|
//
|
|
// Unprivileged ISA (version 20240411)
|
|
//
|
|
|
|
// 2.4: Integer Computational Instructions
|
|
AADDI = obj.ABaseRISCV + obj.A_ARCHSPECIFIC + iota
|
|
ASLTI
|
|
ASLTIU
|
|
AANDI
|
|
AORI
|
|
AXORI
|
|
ASLLI
|
|
ASRLI
|
|
ASRAI
|
|
ALUI
|
|
AAUIPC
|
|
AADD
|
|
ASLT
|
|
ASLTU
|
|
AAND
|
|
AOR
|
|
AXOR
|
|
ASLL
|
|
ASRL
|
|
ASUB
|
|
ASRA
|
|
|
|
// 2.5: Control Transfer Instructions
|
|
AJAL
|
|
AJALR
|
|
ABEQ
|
|
ABNE
|
|
ABLT
|
|
ABLTU
|
|
ABGE
|
|
ABGEU
|
|
|
|
// 2.6: Load and Store Instructions
|
|
ALW
|
|
ALWU
|
|
ALH
|
|
ALHU
|
|
ALB
|
|
ALBU
|
|
ASW
|
|
ASH
|
|
ASB
|
|
|
|
// 2.7: Memory Ordering Instructions
|
|
AFENCE
|
|
|
|
// 4.2: Integer Computational Instructions (RV64I)
|
|
AADDIW
|
|
ASLLIW
|
|
ASRLIW
|
|
ASRAIW
|
|
AADDW
|
|
ASLLW
|
|
ASRLW
|
|
ASUBW
|
|
ASRAW
|
|
|
|
// 4.3: Load and Store Instructions (RV64I)
|
|
ALD
|
|
ASD
|
|
|
|
// 7.1: CSR Instructions (Zicsr)
|
|
ACSRRW
|
|
ACSRRS
|
|
ACSRRC
|
|
ACSRRWI
|
|
ACSRRSI
|
|
ACSRRCI
|
|
|
|
// 13.1: Multiplication Operations
|
|
AMUL
|
|
AMULH
|
|
AMULHU
|
|
AMULHSU
|
|
AMULW
|
|
|
|
// 13.2: Division Operations
|
|
ADIV
|
|
ADIVU
|
|
AREM
|
|
AREMU
|
|
ADIVW
|
|
ADIVUW
|
|
AREMW
|
|
AREMUW
|
|
|
|
// 14.2: Load-Reserved/Store-Conditional Instructions (Zalrsc)
|
|
ALRD
|
|
ASCD
|
|
ALRW
|
|
ASCW
|
|
|
|
// 14.4: Atomic Memory Operations (Zaamo)
|
|
AAMOSWAPD
|
|
AAMOADDD
|
|
AAMOANDD
|
|
AAMOORD
|
|
AAMOXORD
|
|
AAMOMAXD
|
|
AAMOMAXUD
|
|
AAMOMIND
|
|
AAMOMINUD
|
|
AAMOSWAPW
|
|
AAMOADDW
|
|
AAMOANDW
|
|
AAMOORW
|
|
AAMOXORW
|
|
AAMOMAXW
|
|
AAMOMAXUW
|
|
AAMOMINW
|
|
AAMOMINUW
|
|
|
|
// 20.5: Single-Precision Load and Store Instructions
|
|
AFLW
|
|
AFSW
|
|
|
|
// 20.6: Single-Precision Floating-Point Computational Instructions
|
|
AFADDS
|
|
AFSUBS
|
|
AFMULS
|
|
AFDIVS
|
|
AFMINS
|
|
AFMAXS
|
|
AFSQRTS
|
|
AFMADDS
|
|
AFMSUBS
|
|
AFNMADDS
|
|
AFNMSUBS
|
|
|
|
// 20.7: Single-Precision Floating-Point Conversion and Move Instructions
|
|
AFCVTWS
|
|
AFCVTLS
|
|
AFCVTSW
|
|
AFCVTSL
|
|
AFCVTWUS
|
|
AFCVTLUS
|
|
AFCVTSWU
|
|
AFCVTSLU
|
|
AFSGNJS
|
|
AFSGNJNS
|
|
AFSGNJXS
|
|
AFMVXS
|
|
AFMVSX
|
|
AFMVXW
|
|
AFMVWX
|
|
|
|
// 20.8: Single-Precision Floating-Point Compare Instructions
|
|
AFEQS
|
|
AFLTS
|
|
AFLES
|
|
|
|
// 20.9: Single-Precision Floating-Point Classify Instruction
|
|
AFCLASSS
|
|
|
|
// 21.3: Double-Precision Load and Store Instructions
|
|
AFLD
|
|
AFSD
|
|
|
|
// 21.4: Double-Precision Floating-Point Computational Instructions
|
|
AFADDD
|
|
AFSUBD
|
|
AFMULD
|
|
AFDIVD
|
|
AFMIND
|
|
AFMAXD
|
|
AFSQRTD
|
|
AFMADDD
|
|
AFMSUBD
|
|
AFNMADDD
|
|
AFNMSUBD
|
|
|
|
// 21.5: Double-Precision Floating-Point Conversion and Move Instructions
|
|
AFCVTWD
|
|
AFCVTLD
|
|
AFCVTDW
|
|
AFCVTDL
|
|
AFCVTWUD
|
|
AFCVTLUD
|
|
AFCVTDWU
|
|
AFCVTDLU
|
|
AFCVTSD
|
|
AFCVTDS
|
|
AFSGNJD
|
|
AFSGNJND
|
|
AFSGNJXD
|
|
AFMVXD
|
|
AFMVDX
|
|
|
|
// 21.6: Double-Precision Floating-Point Compare Instructions
|
|
AFEQD
|
|
AFLTD
|
|
AFLED
|
|
|
|
// 21.7: Double-Precision Floating-Point Classify Instruction
|
|
AFCLASSD
|
|
|
|
// 22.1 Quad-Precision Load and Store Instructions
|
|
AFLQ
|
|
AFSQ
|
|
|
|
// 22.2: Quad-Precision Computational Instructions
|
|
AFADDQ
|
|
AFSUBQ
|
|
AFMULQ
|
|
AFDIVQ
|
|
AFMINQ
|
|
AFMAXQ
|
|
AFSQRTQ
|
|
AFMADDQ
|
|
AFMSUBQ
|
|
AFNMADDQ
|
|
AFNMSUBQ
|
|
|
|
// 22.3: Quad-Precision Convert and Move Instructions
|
|
AFCVTWQ
|
|
AFCVTLQ
|
|
AFCVTSQ
|
|
AFCVTDQ
|
|
AFCVTQW
|
|
AFCVTQL
|
|
AFCVTQS
|
|
AFCVTQD
|
|
AFCVTWUQ
|
|
AFCVTLUQ
|
|
AFCVTQWU
|
|
AFCVTQLU
|
|
AFSGNJQ
|
|
AFSGNJNQ
|
|
AFSGNJXQ
|
|
|
|
// 22.4: Quad-Precision Floating-Point Compare Instructions
|
|
AFEQQ
|
|
AFLEQ
|
|
AFLTQ
|
|
|
|
// 22.5: Quad-Precision Floating-Point Classify Instruction
|
|
AFCLASSQ
|
|
|
|
//
|
|
// "C" Extension for Compressed Instructions
|
|
//
|
|
|
|
// 26.3.1: Compressed Stack-Pointer-Based Loads and Stores
|
|
ACLWSP
|
|
ACFLWSP
|
|
ACLDSP
|
|
ACFLDSP
|
|
ACSWSP
|
|
ACSDSP
|
|
ACFSWSP
|
|
ACFSDSP
|
|
|
|
// 26.3.2: Compressed Register-Based Loads and Stores
|
|
ACLW
|
|
ACLD
|
|
ACFLW
|
|
ACFLD
|
|
ACSW
|
|
ACSD
|
|
ACFSW
|
|
ACFSD
|
|
|
|
// 26.4: Compressed Control Transfer Instructions
|
|
ACJ
|
|
ACJR
|
|
ACJALR
|
|
ACBEQZ
|
|
ACBNEZ
|
|
|
|
// 26.5.1: Compressed Integer Constant-Generation Instructions
|
|
ACLI
|
|
ACLUI
|
|
ACADDI
|
|
ACADDIW
|
|
ACADDI16SP
|
|
ACADDI4SPN
|
|
ACSLLI
|
|
ACSRLI
|
|
ACSRAI
|
|
ACANDI
|
|
|
|
// 26.5.3: Compressed Integer Register-Register Operations
|
|
ACMV
|
|
ACADD
|
|
ACAND
|
|
ACOR
|
|
ACXOR
|
|
ACSUB
|
|
ACADDW
|
|
ACSUBW
|
|
|
|
// 26.5.5: Compressed NOP Instruction
|
|
ACNOP
|
|
|
|
// 26.5.6: Compressed Breakpoint Instruction
|
|
ACEBREAK
|
|
|
|
//
|
|
// "B" Extension for Bit Manipulation, Version 1.0.0
|
|
//
|
|
|
|
// 28.4.1: Address Generation Instructions (Zba)
|
|
AADDUW
|
|
ASH1ADD
|
|
ASH1ADDUW
|
|
ASH2ADD
|
|
ASH2ADDUW
|
|
ASH3ADD
|
|
ASH3ADDUW
|
|
ASLLIUW
|
|
|
|
// 28.4.2: Basic Bit Manipulation (Zbb)
|
|
AANDN
|
|
AORN
|
|
AXNOR
|
|
ACLZ
|
|
ACLZW
|
|
ACTZ
|
|
ACTZW
|
|
ACPOP
|
|
ACPOPW
|
|
AMAX
|
|
AMAXU
|
|
AMIN
|
|
AMINU
|
|
ASEXTB
|
|
ASEXTH
|
|
AZEXTH
|
|
|
|
// 28.4.3: Bitwise Rotation (Zbb)
|
|
AROL
|
|
AROLW
|
|
AROR
|
|
ARORI
|
|
ARORIW
|
|
ARORW
|
|
AORCB
|
|
AREV8
|
|
|
|
// 28.4.4: Single-bit Instructions (Zbs)
|
|
ABCLR
|
|
ABCLRI
|
|
ABEXT
|
|
ABEXTI
|
|
ABINV
|
|
ABINVI
|
|
ABSET
|
|
ABSETI
|
|
|
|
//
|
|
// "V" Standard Extension for Vector Operations, Version 1.0
|
|
//
|
|
|
|
// 31.6: Configuration-Setting Instructions
|
|
AVSETVLI
|
|
AVSETIVLI
|
|
AVSETVL
|
|
|
|
// 31.7.4: Vector Unit-Stride Instructions
|
|
AVLE8V
|
|
AVLE16V
|
|
AVLE32V
|
|
AVLE64V
|
|
AVSE8V
|
|
AVSE16V
|
|
AVSE32V
|
|
AVSE64V
|
|
AVLMV
|
|
AVSMV
|
|
|
|
// 31.7.5: Vector Strided Instructions
|
|
AVLSE8V
|
|
AVLSE16V
|
|
AVLSE32V
|
|
AVLSE64V
|
|
AVSSE8V
|
|
AVSSE16V
|
|
AVSSE32V
|
|
AVSSE64V
|
|
|
|
// 31.7.6: Vector Indexed Instructions
|
|
AVLUXEI8V
|
|
AVLUXEI16V
|
|
AVLUXEI32V
|
|
AVLUXEI64V
|
|
AVLOXEI8V
|
|
AVLOXEI16V
|
|
AVLOXEI32V
|
|
AVLOXEI64V
|
|
AVSUXEI8V
|
|
AVSUXEI16V
|
|
AVSUXEI32V
|
|
AVSUXEI64V
|
|
AVSOXEI8V
|
|
AVSOXEI16V
|
|
AVSOXEI32V
|
|
AVSOXEI64V
|
|
|
|
// 31.7.7: Unit-stride Fault-Only-First Loads
|
|
AVLE8FFV
|
|
AVLE16FFV
|
|
AVLE32FFV
|
|
AVLE64FFV
|
|
|
|
// 31.7.8. Vector Load/Store Segment Instructions
|
|
|
|
// 31.7.8.1. Vector Unit-Stride Segment Loads and Stores
|
|
AVLSEG2E8V
|
|
AVLSEG3E8V
|
|
AVLSEG4E8V
|
|
AVLSEG5E8V
|
|
AVLSEG6E8V
|
|
AVLSEG7E8V
|
|
AVLSEG8E8V
|
|
AVLSEG2E16V
|
|
AVLSEG3E16V
|
|
AVLSEG4E16V
|
|
AVLSEG5E16V
|
|
AVLSEG6E16V
|
|
AVLSEG7E16V
|
|
AVLSEG8E16V
|
|
AVLSEG2E32V
|
|
AVLSEG3E32V
|
|
AVLSEG4E32V
|
|
AVLSEG5E32V
|
|
AVLSEG6E32V
|
|
AVLSEG7E32V
|
|
AVLSEG8E32V
|
|
AVLSEG2E64V
|
|
AVLSEG3E64V
|
|
AVLSEG4E64V
|
|
AVLSEG5E64V
|
|
AVLSEG6E64V
|
|
AVLSEG7E64V
|
|
AVLSEG8E64V
|
|
|
|
AVSSEG2E8V
|
|
AVSSEG3E8V
|
|
AVSSEG4E8V
|
|
AVSSEG5E8V
|
|
AVSSEG6E8V
|
|
AVSSEG7E8V
|
|
AVSSEG8E8V
|
|
AVSSEG2E16V
|
|
AVSSEG3E16V
|
|
AVSSEG4E16V
|
|
AVSSEG5E16V
|
|
AVSSEG6E16V
|
|
AVSSEG7E16V
|
|
AVSSEG8E16V
|
|
AVSSEG2E32V
|
|
AVSSEG3E32V
|
|
AVSSEG4E32V
|
|
AVSSEG5E32V
|
|
AVSSEG6E32V
|
|
AVSSEG7E32V
|
|
AVSSEG8E32V
|
|
AVSSEG2E64V
|
|
AVSSEG3E64V
|
|
AVSSEG4E64V
|
|
AVSSEG5E64V
|
|
AVSSEG6E64V
|
|
AVSSEG7E64V
|
|
AVSSEG8E64V
|
|
|
|
AVLSEG2E8FFV
|
|
AVLSEG3E8FFV
|
|
AVLSEG4E8FFV
|
|
AVLSEG5E8FFV
|
|
AVLSEG6E8FFV
|
|
AVLSEG7E8FFV
|
|
AVLSEG8E8FFV
|
|
AVLSEG2E16FFV
|
|
AVLSEG3E16FFV
|
|
AVLSEG4E16FFV
|
|
AVLSEG5E16FFV
|
|
AVLSEG6E16FFV
|
|
AVLSEG7E16FFV
|
|
AVLSEG8E16FFV
|
|
AVLSEG2E32FFV
|
|
AVLSEG3E32FFV
|
|
AVLSEG4E32FFV
|
|
AVLSEG5E32FFV
|
|
AVLSEG6E32FFV
|
|
AVLSEG7E32FFV
|
|
AVLSEG8E32FFV
|
|
AVLSEG2E64FFV
|
|
AVLSEG3E64FFV
|
|
AVLSEG4E64FFV
|
|
AVLSEG5E64FFV
|
|
AVLSEG6E64FFV
|
|
AVLSEG7E64FFV
|
|
AVLSEG8E64FFV
|
|
|
|
// 31.7.8.2. Vector Strided Segment Loads and Stores
|
|
AVLSSEG2E8V
|
|
AVLSSEG3E8V
|
|
AVLSSEG4E8V
|
|
AVLSSEG5E8V
|
|
AVLSSEG6E8V
|
|
AVLSSEG7E8V
|
|
AVLSSEG8E8V
|
|
AVLSSEG2E16V
|
|
AVLSSEG3E16V
|
|
AVLSSEG4E16V
|
|
AVLSSEG5E16V
|
|
AVLSSEG6E16V
|
|
AVLSSEG7E16V
|
|
AVLSSEG8E16V
|
|
AVLSSEG2E32V
|
|
AVLSSEG3E32V
|
|
AVLSSEG4E32V
|
|
AVLSSEG5E32V
|
|
AVLSSEG6E32V
|
|
AVLSSEG7E32V
|
|
AVLSSEG8E32V
|
|
AVLSSEG2E64V
|
|
AVLSSEG3E64V
|
|
AVLSSEG4E64V
|
|
AVLSSEG5E64V
|
|
AVLSSEG6E64V
|
|
AVLSSEG7E64V
|
|
AVLSSEG8E64V
|
|
|
|
AVSSSEG2E8V
|
|
AVSSSEG3E8V
|
|
AVSSSEG4E8V
|
|
AVSSSEG5E8V
|
|
AVSSSEG6E8V
|
|
AVSSSEG7E8V
|
|
AVSSSEG8E8V
|
|
AVSSSEG2E16V
|
|
AVSSSEG3E16V
|
|
AVSSSEG4E16V
|
|
AVSSSEG5E16V
|
|
AVSSSEG6E16V
|
|
AVSSSEG7E16V
|
|
AVSSSEG8E16V
|
|
AVSSSEG2E32V
|
|
AVSSSEG3E32V
|
|
AVSSSEG4E32V
|
|
AVSSSEG5E32V
|
|
AVSSSEG6E32V
|
|
AVSSSEG7E32V
|
|
AVSSSEG8E32V
|
|
AVSSSEG2E64V
|
|
AVSSSEG3E64V
|
|
AVSSSEG4E64V
|
|
AVSSSEG5E64V
|
|
AVSSSEG6E64V
|
|
AVSSSEG7E64V
|
|
AVSSSEG8E64V
|
|
|
|
// 31.7.8.3. Vector Indexed Segment Loads and Stores
|
|
AVLOXSEG2EI8V
|
|
AVLOXSEG3EI8V
|
|
AVLOXSEG4EI8V
|
|
AVLOXSEG5EI8V
|
|
AVLOXSEG6EI8V
|
|
AVLOXSEG7EI8V
|
|
AVLOXSEG8EI8V
|
|
AVLOXSEG2EI16V
|
|
AVLOXSEG3EI16V
|
|
AVLOXSEG4EI16V
|
|
AVLOXSEG5EI16V
|
|
AVLOXSEG6EI16V
|
|
AVLOXSEG7EI16V
|
|
AVLOXSEG8EI16V
|
|
AVLOXSEG2EI32V
|
|
AVLOXSEG3EI32V
|
|
AVLOXSEG4EI32V
|
|
AVLOXSEG5EI32V
|
|
AVLOXSEG6EI32V
|
|
AVLOXSEG7EI32V
|
|
AVLOXSEG8EI32V
|
|
AVLOXSEG2EI64V
|
|
AVLOXSEG3EI64V
|
|
AVLOXSEG4EI64V
|
|
AVLOXSEG5EI64V
|
|
AVLOXSEG6EI64V
|
|
AVLOXSEG7EI64V
|
|
AVLOXSEG8EI64V
|
|
|
|
AVSOXSEG2EI8V
|
|
AVSOXSEG3EI8V
|
|
AVSOXSEG4EI8V
|
|
AVSOXSEG5EI8V
|
|
AVSOXSEG6EI8V
|
|
AVSOXSEG7EI8V
|
|
AVSOXSEG8EI8V
|
|
AVSOXSEG2EI16V
|
|
AVSOXSEG3EI16V
|
|
AVSOXSEG4EI16V
|
|
AVSOXSEG5EI16V
|
|
AVSOXSEG6EI16V
|
|
AVSOXSEG7EI16V
|
|
AVSOXSEG8EI16V
|
|
AVSOXSEG2EI32V
|
|
AVSOXSEG3EI32V
|
|
AVSOXSEG4EI32V
|
|
AVSOXSEG5EI32V
|
|
AVSOXSEG6EI32V
|
|
AVSOXSEG7EI32V
|
|
AVSOXSEG8EI32V
|
|
AVSOXSEG2EI64V
|
|
AVSOXSEG3EI64V
|
|
AVSOXSEG4EI64V
|
|
AVSOXSEG5EI64V
|
|
AVSOXSEG6EI64V
|
|
AVSOXSEG7EI64V
|
|
AVSOXSEG8EI64V
|
|
|
|
AVLUXSEG2EI8V
|
|
AVLUXSEG3EI8V
|
|
AVLUXSEG4EI8V
|
|
AVLUXSEG5EI8V
|
|
AVLUXSEG6EI8V
|
|
AVLUXSEG7EI8V
|
|
AVLUXSEG8EI8V
|
|
AVLUXSEG2EI16V
|
|
AVLUXSEG3EI16V
|
|
AVLUXSEG4EI16V
|
|
AVLUXSEG5EI16V
|
|
AVLUXSEG6EI16V
|
|
AVLUXSEG7EI16V
|
|
AVLUXSEG8EI16V
|
|
AVLUXSEG2EI32V
|
|
AVLUXSEG3EI32V
|
|
AVLUXSEG4EI32V
|
|
AVLUXSEG5EI32V
|
|
AVLUXSEG6EI32V
|
|
AVLUXSEG7EI32V
|
|
AVLUXSEG8EI32V
|
|
AVLUXSEG2EI64V
|
|
AVLUXSEG3EI64V
|
|
AVLUXSEG4EI64V
|
|
AVLUXSEG5EI64V
|
|
AVLUXSEG6EI64V
|
|
AVLUXSEG7EI64V
|
|
AVLUXSEG8EI64V
|
|
|
|
AVSUXSEG2EI8V
|
|
AVSUXSEG3EI8V
|
|
AVSUXSEG4EI8V
|
|
AVSUXSEG5EI8V
|
|
AVSUXSEG6EI8V
|
|
AVSUXSEG7EI8V
|
|
AVSUXSEG8EI8V
|
|
AVSUXSEG2EI16V
|
|
AVSUXSEG3EI16V
|
|
AVSUXSEG4EI16V
|
|
AVSUXSEG5EI16V
|
|
AVSUXSEG6EI16V
|
|
AVSUXSEG7EI16V
|
|
AVSUXSEG8EI16V
|
|
AVSUXSEG2EI32V
|
|
AVSUXSEG3EI32V
|
|
AVSUXSEG4EI32V
|
|
AVSUXSEG5EI32V
|
|
AVSUXSEG6EI32V
|
|
AVSUXSEG7EI32V
|
|
AVSUXSEG8EI32V
|
|
AVSUXSEG2EI64V
|
|
AVSUXSEG3EI64V
|
|
AVSUXSEG4EI64V
|
|
AVSUXSEG5EI64V
|
|
AVSUXSEG6EI64V
|
|
AVSUXSEG7EI64V
|
|
AVSUXSEG8EI64V
|
|
|
|
// 31.7.9: Vector Load/Store Whole Register Instructions
|
|
AVL1RE8V
|
|
AVL1RE16V
|
|
AVL1RE32V
|
|
AVL1RE64V
|
|
AVL2RE8V
|
|
AVL2RE16V
|
|
AVL2RE32V
|
|
AVL2RE64V
|
|
AVL4RE8V
|
|
AVL4RE16V
|
|
AVL4RE32V
|
|
AVL4RE64V
|
|
AVL8RE8V
|
|
AVL8RE16V
|
|
AVL8RE32V
|
|
AVL8RE64V
|
|
AVS1RV
|
|
AVS2RV
|
|
AVS4RV
|
|
AVS8RV
|
|
|
|
// 31.11.1: Vector Single-Width Integer Add and Subtract
|
|
AVADDVV
|
|
AVADDVX
|
|
AVADDVI
|
|
AVSUBVV
|
|
AVSUBVX
|
|
AVRSUBVX
|
|
AVRSUBVI
|
|
|
|
// 31.11.2: Vector Widening Integer Add/Subtract
|
|
AVWADDUVV
|
|
AVWADDUVX
|
|
AVWSUBUVV
|
|
AVWSUBUVX
|
|
AVWADDVV
|
|
AVWADDVX
|
|
AVWSUBVV
|
|
AVWSUBVX
|
|
AVWADDUWV
|
|
AVWADDUWX
|
|
AVWSUBUWV
|
|
AVWSUBUWX
|
|
AVWADDWV
|
|
AVWADDWX
|
|
AVWSUBWV
|
|
AVWSUBWX
|
|
|
|
// 31.11.3: Vector Integer Extension
|
|
AVZEXTVF2
|
|
AVSEXTVF2
|
|
AVZEXTVF4
|
|
AVSEXTVF4
|
|
AVZEXTVF8
|
|
AVSEXTVF8
|
|
|
|
// 31.11.4: Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
|
|
AVADCVVM
|
|
AVADCVXM
|
|
AVADCVIM
|
|
AVMADCVVM
|
|
AVMADCVXM
|
|
AVMADCVIM
|
|
AVMADCVV
|
|
AVMADCVX
|
|
AVMADCVI
|
|
AVSBCVVM
|
|
AVSBCVXM
|
|
AVMSBCVVM
|
|
AVMSBCVXM
|
|
AVMSBCVV
|
|
AVMSBCVX
|
|
|
|
// 31.11.5: Vector Bitwise Logical Instructions
|
|
AVANDVV
|
|
AVANDVX
|
|
AVANDVI
|
|
AVORVV
|
|
AVORVX
|
|
AVORVI
|
|
AVXORVV
|
|
AVXORVX
|
|
AVXORVI
|
|
|
|
// 31.11.6: Vector Single-Width Shift Instructions
|
|
AVSLLVV
|
|
AVSLLVX
|
|
AVSLLVI
|
|
AVSRLVV
|
|
AVSRLVX
|
|
AVSRLVI
|
|
AVSRAVV
|
|
AVSRAVX
|
|
AVSRAVI
|
|
|
|
// 31.11.7: Vector Narrowing Integer Right Shift Instructions
|
|
AVNSRLWV
|
|
AVNSRLWX
|
|
AVNSRLWI
|
|
AVNSRAWV
|
|
AVNSRAWX
|
|
AVNSRAWI
|
|
|
|
// 31.11.8: Vector Integer Compare Instructions
|
|
AVMSEQVV
|
|
AVMSEQVX
|
|
AVMSEQVI
|
|
AVMSNEVV
|
|
AVMSNEVX
|
|
AVMSNEVI
|
|
AVMSLTUVV
|
|
AVMSLTUVX
|
|
AVMSLTVV
|
|
AVMSLTVX
|
|
AVMSLEUVV
|
|
AVMSLEUVX
|
|
AVMSLEUVI
|
|
AVMSLEVV
|
|
AVMSLEVX
|
|
AVMSLEVI
|
|
AVMSGTUVX
|
|
AVMSGTUVI
|
|
AVMSGTVX
|
|
AVMSGTVI
|
|
|
|
// 31.11.9: Vector Integer Min/Max Instructions
|
|
AVMINUVV
|
|
AVMINUVX
|
|
AVMINVV
|
|
AVMINVX
|
|
AVMAXUVV
|
|
AVMAXUVX
|
|
AVMAXVV
|
|
AVMAXVX
|
|
|
|
// 31.11.10: Vector Single-Width Integer Multiply Instructions
|
|
AVMULVV
|
|
AVMULVX
|
|
AVMULHVV
|
|
AVMULHVX
|
|
AVMULHUVV
|
|
AVMULHUVX
|
|
AVMULHSUVV
|
|
AVMULHSUVX
|
|
|
|
// 31.11.11: Vector Integer Divide Instructions
|
|
AVDIVUVV
|
|
AVDIVUVX
|
|
AVDIVVV
|
|
AVDIVVX
|
|
AVREMUVV
|
|
AVREMUVX
|
|
AVREMVV
|
|
AVREMVX
|
|
|
|
// 31.11.12: Vector Widening Integer Multiply Instructions
|
|
AVWMULVV
|
|
AVWMULVX
|
|
AVWMULUVV
|
|
AVWMULUVX
|
|
AVWMULSUVV
|
|
AVWMULSUVX
|
|
|
|
// 31.11.13: Vector Single-Width Integer Multiply-Add Instructions
|
|
AVMACCVV
|
|
AVMACCVX
|
|
AVNMSACVV
|
|
AVNMSACVX
|
|
AVMADDVV
|
|
AVMADDVX
|
|
AVNMSUBVV
|
|
AVNMSUBVX
|
|
|
|
// 31.11.14: Vector Widening Integer Multiply-Add Instructions
|
|
AVWMACCUVV
|
|
AVWMACCUVX
|
|
AVWMACCVV
|
|
AVWMACCVX
|
|
AVWMACCSUVV
|
|
AVWMACCSUVX
|
|
AVWMACCUSVX
|
|
|
|
// 31.11.15: Vector Integer Merge Instructions
|
|
AVMERGEVVM
|
|
AVMERGEVXM
|
|
AVMERGEVIM
|
|
|
|
// 31.11.16: Vector Integer Move Instructions
|
|
AVMVVV
|
|
AVMVVX
|
|
AVMVVI
|
|
|
|
// 31.12.1: Vector Single-Width Saturating Add and Subtract
|
|
AVSADDUVV
|
|
AVSADDUVX
|
|
AVSADDUVI
|
|
AVSADDVV
|
|
AVSADDVX
|
|
AVSADDVI
|
|
AVSSUBUVV
|
|
AVSSUBUVX
|
|
AVSSUBVV
|
|
AVSSUBVX
|
|
|
|
// 31.12.2: Vector Single-Width Averaging Add and Subtract
|
|
AVAADDUVV
|
|
AVAADDUVX
|
|
AVAADDVV
|
|
AVAADDVX
|
|
AVASUBUVV
|
|
AVASUBUVX
|
|
AVASUBVV
|
|
AVASUBVX
|
|
|
|
// 31.12.3: Vector Single-Width Fractional Multiply with Rounding and Saturation
|
|
AVSMULVV
|
|
AVSMULVX
|
|
|
|
// 31.12.4: Vector Single-Width Scaling Shift Instructions
|
|
AVSSRLVV
|
|
AVSSRLVX
|
|
AVSSRLVI
|
|
AVSSRAVV
|
|
AVSSRAVX
|
|
AVSSRAVI
|
|
|
|
// 31.12.5: Vector Narrowing Fixed-Point Clip Instructions
|
|
AVNCLIPUWV
|
|
AVNCLIPUWX
|
|
AVNCLIPUWI
|
|
AVNCLIPWV
|
|
AVNCLIPWX
|
|
AVNCLIPWI
|
|
|
|
// 31.13.2: Vector Single-Width Floating-Point Add/Subtract Instructions
|
|
AVFADDVV
|
|
AVFADDVF
|
|
AVFSUBVV
|
|
AVFSUBVF
|
|
AVFRSUBVF
|
|
|
|
// 31.13.3: Vector Widening Floating-Point Add/Subtract Instructions
|
|
AVFWADDVV
|
|
AVFWADDVF
|
|
AVFWSUBVV
|
|
AVFWSUBVF
|
|
AVFWADDWV
|
|
AVFWADDWF
|
|
AVFWSUBWV
|
|
AVFWSUBWF
|
|
|
|
// 31.13.4: Vector Single-Width Floating-Point Multiply/Divide Instructions
|
|
AVFMULVV
|
|
AVFMULVF
|
|
AVFDIVVV
|
|
AVFDIVVF
|
|
AVFRDIVVF
|
|
|
|
// 31.13.5: Vector Widening Floating-Point Multiply
|
|
AVFWMULVV
|
|
AVFWMULVF
|
|
|
|
// 31.13.6: Vector Single-Width Floating-Point Fused Multiply-Add Instructions
|
|
AVFMACCVV
|
|
AVFMACCVF
|
|
AVFNMACCVV
|
|
AVFNMACCVF
|
|
AVFMSACVV
|
|
AVFMSACVF
|
|
AVFNMSACVV
|
|
AVFNMSACVF
|
|
AVFMADDVV
|
|
AVFMADDVF
|
|
AVFNMADDVV
|
|
AVFNMADDVF
|
|
AVFMSUBVV
|
|
AVFMSUBVF
|
|
AVFNMSUBVV
|
|
AVFNMSUBVF
|
|
|
|
// 31.13.7: Vector Widening Floating-Point Fused Multiply-Add Instructions
|
|
AVFWMACCVV
|
|
AVFWMACCVF
|
|
AVFWNMACCVV
|
|
AVFWNMACCVF
|
|
AVFWMSACVV
|
|
AVFWMSACVF
|
|
AVFWNMSACVV
|
|
AVFWNMSACVF
|
|
|
|
// 31.13.8: Vector Floating-Point Square-Root Instruction
|
|
AVFSQRTV
|
|
|
|
// 31.13.9: Vector Floating-Point Reciprocal Square-Root Estimate Instruction
|
|
AVFRSQRT7V
|
|
|
|
// 31.13.10: Vector Floating-Point Reciprocal Estimate Instruction
|
|
AVFREC7V
|
|
|
|
// 31.13.11: Vector Floating-Point MIN/MAX Instructions
|
|
AVFMINVV
|
|
AVFMINVF
|
|
AVFMAXVV
|
|
AVFMAXVF
|
|
|
|
// 31.13.12: Vector Floating-Point Sign-Injection Instructions
|
|
AVFSGNJVV
|
|
AVFSGNJVF
|
|
AVFSGNJNVV
|
|
AVFSGNJNVF
|
|
AVFSGNJXVV
|
|
AVFSGNJXVF
|
|
|
|
// 31.13.13: Vector Floating-Point Compare Instructions
|
|
AVMFEQVV
|
|
AVMFEQVF
|
|
AVMFNEVV
|
|
AVMFNEVF
|
|
AVMFLTVV
|
|
AVMFLTVF
|
|
AVMFLEVV
|
|
AVMFLEVF
|
|
AVMFGTVF
|
|
AVMFGEVF
|
|
|
|
// 31.13.14: Vector Floating-Point Classify Instruction
|
|
AVFCLASSV
|
|
|
|
// 31.13.15: Vector Floating-Point Merge Instruction
|
|
AVFMERGEVFM
|
|
|
|
// 31.13.16: Vector Floating-Point Move Instruction
|
|
AVFMVVF
|
|
|
|
// 31.13.17: Single-Width Floating-Point/Integer Type-Convert Instructions
|
|
AVFCVTXUFV
|
|
AVFCVTXFV
|
|
AVFCVTRTZXUFV
|
|
AVFCVTRTZXFV
|
|
AVFCVTFXUV
|
|
AVFCVTFXV
|
|
|
|
// 31.13.18: Widening Floating-Point/Integer Type-Convert Instructions
|
|
AVFWCVTXUFV
|
|
AVFWCVTXFV
|
|
AVFWCVTRTZXUFV
|
|
AVFWCVTRTZXFV
|
|
AVFWCVTFXUV
|
|
AVFWCVTFXV
|
|
AVFWCVTFFV
|
|
|
|
// 31.13.19: Narrowing Floating-Point/Integer Type-Convert Instructions
|
|
AVFNCVTXUFW
|
|
AVFNCVTXFW
|
|
AVFNCVTRTZXUFW
|
|
AVFNCVTRTZXFW
|
|
AVFNCVTFXUW
|
|
AVFNCVTFXW
|
|
AVFNCVTFFW
|
|
AVFNCVTRODFFW
|
|
|
|
// 31.14.1: Vector Single-Width Integer Reduction Instructions
|
|
AVREDSUMVS
|
|
AVREDMAXUVS
|
|
AVREDMAXVS
|
|
AVREDMINUVS
|
|
AVREDMINVS
|
|
AVREDANDVS
|
|
AVREDORVS
|
|
AVREDXORVS
|
|
|
|
// 31.14.2: Vector Widening Integer Reduction Instructions
|
|
AVWREDSUMUVS
|
|
AVWREDSUMVS
|
|
|
|
// 31.14.3: Vector Single-Width Floating-Point Reduction Instructions
|
|
AVFREDOSUMVS
|
|
AVFREDUSUMVS
|
|
AVFREDMAXVS
|
|
AVFREDMINVS
|
|
|
|
// 31.14.4: Vector Widening Floating-Point Reduction Instructions
|
|
AVFWREDOSUMVS
|
|
AVFWREDUSUMVS
|
|
|
|
// 31.15: Vector Mask Instructions
|
|
AVMANDMM
|
|
AVMNANDMM
|
|
AVMANDNMM
|
|
AVMXORMM
|
|
AVMORMM
|
|
AVMNORMM
|
|
AVMORNMM
|
|
AVMXNORMM
|
|
AVCPOPM
|
|
AVFIRSTM
|
|
AVMSBFM
|
|
AVMSIFM
|
|
AVMSOFM
|
|
AVIOTAM
|
|
AVIDV
|
|
|
|
// 31.16.1: Integer Scalar Move Instructions
|
|
AVMVXS
|
|
AVMVSX
|
|
|
|
// 31.16.2: Floating-Point Scalar Move Instructions
|
|
AVFMVFS
|
|
AVFMVSF
|
|
|
|
// 31.16.3: Vector Slide Instructions
|
|
AVSLIDEUPVX
|
|
AVSLIDEUPVI
|
|
AVSLIDEDOWNVX
|
|
AVSLIDEDOWNVI
|
|
AVSLIDE1UPVX
|
|
AVFSLIDE1UPVF
|
|
AVSLIDE1DOWNVX
|
|
AVFSLIDE1DOWNVF
|
|
|
|
// 31.16.4: Vector Register Gather Instructions
|
|
AVRGATHERVV
|
|
AVRGATHEREI16VV
|
|
AVRGATHERVX
|
|
AVRGATHERVI
|
|
|
|
// 31.16.5: Vector Compress Instruction
|
|
AVCOMPRESSVM
|
|
|
|
// 31.16.6: Whole Vector Register Move
|
|
AVMV1RV
|
|
AVMV2RV
|
|
AVMV4RV
|
|
AVMV8RV
|
|
|
|
//
|
|
// Privileged ISA (version 20240411)
|
|
//
|
|
|
|
// 3.3.1: Environment Call and Breakpoint
|
|
AECALL
|
|
ASCALL
|
|
AEBREAK
|
|
ASBREAK
|
|
|
|
// 3.3.2: Trap-Return Instructions
|
|
AMRET
|
|
ASRET
|
|
ADRET
|
|
|
|
// 3.3.3: Wait for Interrupt
|
|
AWFI
|
|
|
|
// 10.2: Supervisor Memory-Management Fence Instruction
|
|
ASFENCEVMA
|
|
|
|
// The escape hatch. Inserts a single 32-bit word.
|
|
AWORD
|
|
|
|
// Pseudo-instructions. These get translated by the assembler into other
|
|
// instructions, based on their operands.
|
|
ABEQZ
|
|
ABGEZ
|
|
ABGT
|
|
ABGTU
|
|
ABGTZ
|
|
ABLE
|
|
ABLEU
|
|
ABLEZ
|
|
ABLTZ
|
|
ABNEZ
|
|
AFABSD
|
|
AFABSS
|
|
AFNED
|
|
AFNEGD
|
|
AFNEGS
|
|
AFNES
|
|
AMOV
|
|
AMOVB
|
|
AMOVBU
|
|
AMOVD
|
|
AMOVF
|
|
AMOVH
|
|
AMOVHU
|
|
AMOVW
|
|
AMOVWU
|
|
ANEG
|
|
ANEGW
|
|
ANOT
|
|
ARDCYCLE
|
|
ARDINSTRET
|
|
ARDTIME
|
|
ASEQZ
|
|
ASNEZ
|
|
AVFABSV
|
|
AVFNEGV
|
|
AVL1RV
|
|
AVL2RV
|
|
AVL4RV
|
|
AVL8RV
|
|
AVMCLRM
|
|
AVMFGEVV
|
|
AVMFGTVV
|
|
AVMMVM
|
|
AVMNOTM
|
|
AVMSETM
|
|
AVMSGEUVI
|
|
AVMSGEUVV
|
|
AVMSGEVI
|
|
AVMSGEVV
|
|
AVMSGTUVV
|
|
AVMSGTVV
|
|
AVMSLTUVI
|
|
AVMSLTVI
|
|
AVNCVTXXW
|
|
AVNEGV
|
|
AVNOTV
|
|
AVWCVTUXXV
|
|
AVWCVTXXV
|
|
|
|
// End marker
|
|
ALAST
|
|
)
|
|
|
|
// opSuffix encoding to uint8 which fit into p.Scond
|
|
var rmSuffixSet = map[string]uint8{
|
|
"RNE": RM_RNE,
|
|
"RTZ": RM_RTZ,
|
|
"RDN": RM_RDN,
|
|
"RUP": RM_RUP,
|
|
"RMM": RM_RMM,
|
|
}
|
|
|
|
const rmSuffixBit uint8 = 1 << 7
|
|
|
|
func rmSuffixEncode(s string) (uint8, error) {
|
|
if s == "" {
|
|
return 0, errors.New("empty suffix")
|
|
}
|
|
enc, ok := rmSuffixSet[s]
|
|
if !ok {
|
|
return 0, fmt.Errorf("invalid encoding for unknown suffix:%q", s)
|
|
}
|
|
return enc | rmSuffixBit, nil
|
|
}
|
|
|
|
func rmSuffixString(u uint8) (string, error) {
|
|
if u&rmSuffixBit == 0 {
|
|
return "", fmt.Errorf("invalid suffix, require round mode bit:%x", u)
|
|
}
|
|
|
|
u &^= rmSuffixBit
|
|
for k, v := range rmSuffixSet {
|
|
if v == u {
|
|
return k, nil
|
|
}
|
|
}
|
|
return "", fmt.Errorf("unknown suffix:%x", u)
|
|
}
|
|
|
|
const (
|
|
RM_RNE uint8 = iota // Round to Nearest, ties to Even
|
|
RM_RTZ // Round towards Zero
|
|
RM_RDN // Round Down
|
|
RM_RUP // Round Up
|
|
RM_RMM // Round to Nearest, ties to Max Magnitude
|
|
)
|
|
|
|
type SpecialOperand int
|
|
|
|
const (
|
|
SPOP_BEGIN SpecialOperand = obj.SpecialOperandRISCVBase
|
|
SPOP_RVV_BEGIN
|
|
|
|
// Vector mask policy.
|
|
SPOP_MA SpecialOperand = obj.SpecialOperandRISCVBase + iota - 2
|
|
SPOP_MU
|
|
|
|
// Vector tail policy.
|
|
SPOP_TA
|
|
SPOP_TU
|
|
|
|
// Vector register group multiplier (VLMUL).
|
|
SPOP_M1
|
|
SPOP_M2
|
|
SPOP_M4
|
|
SPOP_M8
|
|
SPOP_MF2
|
|
SPOP_MF4
|
|
SPOP_MF8
|
|
|
|
// Vector selected element width (VSEW).
|
|
SPOP_E8
|
|
SPOP_E16
|
|
SPOP_E32
|
|
SPOP_E64
|
|
SPOP_RVV_END
|
|
|
|
// CSR names. 4096 special operands are reserved for RISC-V CSR names.
|
|
SPOP_CSR_BEGIN = SPOP_RVV_END
|
|
SPOP_CSR_END = SPOP_CSR_BEGIN + 4096
|
|
|
|
SPOP_END = SPOP_CSR_END + 1
|
|
)
|
|
|
|
var specialOperands = map[SpecialOperand]struct {
|
|
encoding uint32
|
|
name string
|
|
}{
|
|
SPOP_MA: {encoding: 1, name: "MA"},
|
|
SPOP_MU: {encoding: 0, name: "MU"},
|
|
|
|
SPOP_TA: {encoding: 1, name: "TA"},
|
|
SPOP_TU: {encoding: 0, name: "TU"},
|
|
|
|
SPOP_M1: {encoding: 0, name: "M1"},
|
|
SPOP_M2: {encoding: 1, name: "M2"},
|
|
SPOP_M4: {encoding: 2, name: "M4"},
|
|
SPOP_M8: {encoding: 3, name: "M8"},
|
|
SPOP_MF8: {encoding: 5, name: "MF8"},
|
|
SPOP_MF4: {encoding: 6, name: "MF4"},
|
|
SPOP_MF2: {encoding: 7, name: "MF2"},
|
|
|
|
SPOP_E8: {encoding: 0, name: "E8"},
|
|
SPOP_E16: {encoding: 1, name: "E16"},
|
|
SPOP_E32: {encoding: 2, name: "E32"},
|
|
SPOP_E64: {encoding: 3, name: "E64"},
|
|
}
|
|
|
|
func (so SpecialOperand) encode() uint32 {
|
|
switch {
|
|
case so >= SPOP_RVV_BEGIN && so < SPOP_RVV_END:
|
|
op, ok := specialOperands[so]
|
|
if ok {
|
|
return op.encoding
|
|
}
|
|
case so >= SPOP_CSR_BEGIN && so < SPOP_CSR_END:
|
|
csrNum := uint16(so - SPOP_CSR_BEGIN)
|
|
if _, ok := csrs[csrNum]; ok {
|
|
return uint32(csrNum)
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// String returns the textual representation of a SpecialOperand.
|
|
func (so SpecialOperand) String() string {
|
|
switch {
|
|
case so >= SPOP_RVV_BEGIN && so < SPOP_RVV_END:
|
|
op, ok := specialOperands[so]
|
|
if ok {
|
|
return op.name
|
|
}
|
|
case so >= SPOP_CSR_BEGIN && so < SPOP_CSR_END:
|
|
if csrName, ok := csrs[uint16(so-SPOP_CSR_BEGIN)]; ok {
|
|
return csrName
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// All unary instructions which write to their arguments (as opposed to reading
|
|
// from them) go here. The assembly parser uses this information to populate
|
|
// its AST in a semantically reasonable way.
|
|
//
|
|
// Any instructions not listed here are assumed to either be non-unary or to read
|
|
// from its argument.
|
|
var unaryDst = map[obj.As]bool{
|
|
ARDCYCLE: true,
|
|
ARDTIME: true,
|
|
ARDINSTRET: true,
|
|
}
|
|
|
|
// Instruction encoding masks.
|
|
const (
|
|
// BTypeImmMask is a mask including only the immediate portion of
|
|
// B-type instructions.
|
|
BTypeImmMask = 0xfe000f80
|
|
|
|
// CBTypeImmMask is a mask including only the immediate portion of
|
|
// CB-type instructions.
|
|
CBTypeImmMask = 0x1c7c
|
|
|
|
// CJTypeImmMask is a mask including only the immediate portion of
|
|
// CJ-type instructions.
|
|
CJTypeImmMask = 0x1f7c
|
|
|
|
// ITypeImmMask is a mask including only the immediate portion of
|
|
// I-type instructions.
|
|
ITypeImmMask = 0xfff00000
|
|
|
|
// JTypeImmMask is a mask including only the immediate portion of
|
|
// J-type instructions.
|
|
JTypeImmMask = 0xfffff000
|
|
|
|
// STypeImmMask is a mask including only the immediate portion of
|
|
// S-type instructions.
|
|
STypeImmMask = 0xfe000f80
|
|
|
|
// UTypeImmMask is a mask including only the immediate portion of
|
|
// U-type instructions.
|
|
UTypeImmMask = 0xfffff000
|
|
)
|