supporting more instructions seen in stdlib
This commit is contained in:
2
internal/inst/testdata/stdlibopcodes.txt
vendored
2
internal/inst/testdata/stdlibopcodes.txt
vendored
@@ -22,7 +22,6 @@ BSRQ
|
||||
BSWAPL
|
||||
BSWAPQ
|
||||
BTQ
|
||||
BYTE
|
||||
CALL
|
||||
CMOVQCC
|
||||
CMOVQCS
|
||||
@@ -51,7 +50,6 @@ DECQ
|
||||
DIVL
|
||||
DIVQ
|
||||
DIVSD
|
||||
FUNCDATA
|
||||
IMUL3Q
|
||||
IMULQ
|
||||
INCB
|
||||
|
||||
@@ -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
37
internal/load/annoyingaliases.sh
Executable file
37
internal/load/annoyingaliases.sh
Executable 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}
|
||||
@@ -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
68
internal/load/tables.go
Normal 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
|
||||
43
internal/load/zannoyingaliases.go
Normal file
43
internal/load/zannoyingaliases.go
Normal 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",
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user