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
|
BSWAPL
|
||||||
BSWAPQ
|
BSWAPQ
|
||||||
BTQ
|
BTQ
|
||||||
BYTE
|
|
||||||
CALL
|
CALL
|
||||||
CMOVQCC
|
CMOVQCC
|
||||||
CMOVQCS
|
CMOVQCS
|
||||||
@@ -51,7 +50,6 @@ DECQ
|
|||||||
DIVL
|
DIVL
|
||||||
DIVQ
|
DIVQ
|
||||||
DIVSD
|
DIVSD
|
||||||
FUNCDATA
|
|
||||||
IMUL3Q
|
IMUL3Q
|
||||||
IMULQ
|
IMULQ
|
||||||
INCB
|
INCB
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package inst
|
package inst
|
||||||
|
|
||||||
//go:generate avogen -data ../data -output ztable.go godata
|
|
||||||
|
|
||||||
type Instruction struct {
|
type Instruction struct {
|
||||||
Opcode string
|
Opcode string
|
||||||
Summary 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.
|
// Convert to a slice, sorted by opcode.
|
||||||
is := make([]inst.Instruction, 0, len(im))
|
is := make([]inst.Instruction, 0, len(im))
|
||||||
for _, i := range 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.
|
# Preprocess all assembly files.
|
||||||
asm=${workdir}/all.s
|
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}
|
gcc -E -I${GOROOT}/pkg/include -I${include} ${s} >>${asm}
|
||||||
done
|
done
|
||||||
|
|
||||||
# Extract instructions.
|
# 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.
|
# Clean.
|
||||||
rm -rf ${workdir}
|
rm -rf ${workdir}
|
||||||
|
|||||||
Reference in New Issue
Block a user