supporting more instructions seen in stdlib

This commit is contained in:
Michael McLoughlin
2018-11-24 17:32:18 -08:00
parent 124587f55c
commit 0edbdb064f
8 changed files with 1186 additions and 17 deletions

View File

@@ -22,7 +22,6 @@ BSRQ
BSWAPL
BSWAPQ
BTQ
BYTE
CALL
CMOVQCC
CMOVQCS
@@ -51,7 +50,6 @@ DECQ
DIVL
DIVQ
DIVSD
FUNCDATA
IMUL3Q
IMULQ
INCB

View File

@@ -1,7 +1,5 @@
package inst
//go:generate avogen -data ../data -output ztable.go godata
type Instruction struct {
Opcode string
Summary string

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
#!/bin/bash -e
self=$(basename $0)
output=$1
eval $(go env)
arch=${GOROOT}/src/cmd/asm/internal/arch/arch.go
{
echo "// Code generated by ${self}. DO NOT EDIT."
echo
echo 'package load'
echo
echo 'var annoyingaliases = map[string]string{'
awk '
/archX86/ { x86=1 }
/^}/ { x86=0 }
x86 && /x86/ && /instructions\[/ {
from=$1
to=$3
sub(/instructions\[\"/, "", from)
sub(/\"\]/, "", from)
sub(/x86\.A/, "", to)
if(from != to) {
printf("\t\"%s\": \"%s\",\n", from, to)
}
}
' ${arch}
echo '}'
} | gofmt > ${output}

View File

@@ -62,6 +62,13 @@ func (l *Loader) Load() ([]inst.Instruction, error) {
}
}
// Apply list of "annoying aliases".
for from, to := range annoyingaliases {
cpy := *im[to]
cpy.Opcode = from
im[from] = &cpy
}
// Convert to a slice, sorted by opcode.
is := make([]inst.Instruction, 0, len(im))
for _, i := range im {

68
internal/load/tables.go Normal file
View File

@@ -0,0 +1,68 @@
package load
// Go contains a list of self-proclaimed "Annoying aliases", as follows. We use
// a script to automatically extract this list from the source code (see the
// following go:generate line).
//
// Reference: https://github.com/golang/go/blob/048c9164a0c5572df18325e377473e7893dbfb07/src/cmd/asm/internal/arch/arch.go#L126-L182
//
// }
// // Annoying aliases.
// instructions["JA"] = x86.AJHI /* alternate */
// instructions["JAE"] = x86.AJCC /* alternate */
// instructions["JB"] = x86.AJCS /* alternate */
// instructions["JBE"] = x86.AJLS /* alternate */
// instructions["JC"] = x86.AJCS /* alternate */
// instructions["JCC"] = x86.AJCC /* carry clear (CF = 0) */
// instructions["JCS"] = x86.AJCS /* carry set (CF = 1) */
// instructions["JE"] = x86.AJEQ /* alternate */
// instructions["JEQ"] = x86.AJEQ /* equal (ZF = 1) */
// instructions["JG"] = x86.AJGT /* alternate */
// instructions["JGE"] = x86.AJGE /* greater than or equal (signed) (SF = OF) */
// instructions["JGT"] = x86.AJGT /* greater than (signed) (ZF = 0 && SF = OF) */
// instructions["JHI"] = x86.AJHI /* higher (unsigned) (CF = 0 && ZF = 0) */
// instructions["JHS"] = x86.AJCC /* alternate */
// instructions["JL"] = x86.AJLT /* alternate */
// instructions["JLE"] = x86.AJLE /* less than or equal (signed) (ZF = 1 || SF != OF) */
// instructions["JLO"] = x86.AJCS /* alternate */
// instructions["JLS"] = x86.AJLS /* lower or same (unsigned) (CF = 1 || ZF = 1) */
// instructions["JLT"] = x86.AJLT /* less than (signed) (SF != OF) */
// instructions["JMI"] = x86.AJMI /* negative (minus) (SF = 1) */
// instructions["JNA"] = x86.AJLS /* alternate */
// instructions["JNAE"] = x86.AJCS /* alternate */
// instructions["JNB"] = x86.AJCC /* alternate */
// instructions["JNBE"] = x86.AJHI /* alternate */
// instructions["JNC"] = x86.AJCC /* alternate */
// instructions["JNE"] = x86.AJNE /* not equal (ZF = 0) */
// instructions["JNG"] = x86.AJLE /* alternate */
// instructions["JNGE"] = x86.AJLT /* alternate */
// instructions["JNL"] = x86.AJGE /* alternate */
// instructions["JNLE"] = x86.AJGT /* alternate */
// instructions["JNO"] = x86.AJOC /* alternate */
// instructions["JNP"] = x86.AJPC /* alternate */
// instructions["JNS"] = x86.AJPL /* alternate */
// instructions["JNZ"] = x86.AJNE /* alternate */
// instructions["JO"] = x86.AJOS /* alternate */
// instructions["JOC"] = x86.AJOC /* overflow clear (OF = 0) */
// instructions["JOS"] = x86.AJOS /* overflow set (OF = 1) */
// instructions["JP"] = x86.AJPS /* alternate */
// instructions["JPC"] = x86.AJPC /* parity clear (PF = 0) */
// instructions["JPE"] = x86.AJPS /* alternate */
// instructions["JPL"] = x86.AJPL /* non-negative (plus) (SF = 0) */
// instructions["JPO"] = x86.AJPC /* alternate */
// instructions["JPS"] = x86.AJPS /* parity set (PF = 1) */
// instructions["JS"] = x86.AJMI /* alternate */
// instructions["JZ"] = x86.AJEQ /* alternate */
// instructions["MASKMOVDQU"] = x86.AMASKMOVOU
// instructions["MOVD"] = x86.AMOVQ
// instructions["MOVDQ2Q"] = x86.AMOVQ
// instructions["MOVNTDQ"] = x86.AMOVNTO
// instructions["MOVOA"] = x86.AMOVO
// instructions["PSLLDQ"] = x86.APSLLO
// instructions["PSRLDQ"] = x86.APSRLO
// instructions["PADDD"] = x86.APADDL
//
// return &Arch{
//
//go:generate ./annoyingaliases.sh zannoyingaliases.go

View File

@@ -0,0 +1,43 @@
// Code generated by annoyingaliases.sh. DO NOT EDIT.
package load
var annoyingaliases = map[string]string{
"JA": "JHI",
"JAE": "JCC",
"JB": "JCS",
"JBE": "JLS",
"JC": "JCS",
"JE": "JEQ",
"JG": "JGT",
"JHS": "JCC",
"JL": "JLT",
"JLO": "JCS",
"JNA": "JLS",
"JNAE": "JCS",
"JNB": "JCC",
"JNBE": "JHI",
"JNC": "JCC",
"JNG": "JLE",
"JNGE": "JLT",
"JNL": "JGE",
"JNLE": "JGT",
"JNO": "JOC",
"JNP": "JPC",
"JNS": "JPL",
"JNZ": "JNE",
"JO": "JOS",
"JP": "JPS",
"JPE": "JPS",
"JPO": "JPC",
"JS": "JMI",
"JZ": "JEQ",
"MASKMOVDQU": "MASKMOVOU",
"MOVD": "MOVQ",
"MOVDQ2Q": "MOVQ",
"MOVNTDQ": "MOVNTO",
"MOVOA": "MOVO",
"PSLLDQ": "PSLLO",
"PSRLDQ": "PSRLO",
"PADDD": "PADDL",
}

View File

@@ -11,12 +11,14 @@ echo '#define get_tls ' > ${include}/go_asm.h
# Preprocess all assembly files.
asm=${workdir}/all.s
find ${GOROOT}/src -name '*_amd64.s' | while read s; do
find ${GOROOT}/src -name '*_amd64.s' | grep -v testdata | while read s; do
gcc -E -I${GOROOT}/pkg/include -I${include} ${s} >>${asm}
done
# Extract instructions.
awk '/^[[:space:]]+[A-Z0-9]+[[:space:]]+/ { print $1 }' ${asm} | sort | uniq
awk '/^[[:space:]]+[A-Z0-9]+[[:space:]]+/ { print $1 }' ${asm} | \
sort | uniq | \
grep -Ev '(TEXT|FUNCDATA|PCDATA|BYTE|WORD)'
# Clean.
rm -rf ${workdir}