Skip to content

Find inconsistencies between the intel intrinsics XML file and the Rust code #240

Closed
@gwenn

Description

@gwenn

XSLT (data.xsl):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
 
    <xsl:variable name="line">
        <xsl:text>&#10;</xsl:text>
    </xsl:variable>
    <xsl:variable name="sep">
        <xsl:text>;</xsl:text>
    </xsl:variable>
 
    <xsl:template match="/">
        <xsl:for-each select="intrinsics_list/intrinsic">
            <xsl:variable name="name" select="@name"/>
            <xsl:variable name="cpuid" select="CPUID"/>
            <xsl:variable name="instruction" select="instruction/@name"/>
            <xsl:value-of select="concat($name, $sep, $cpuid, $sep, $instruction, $line)"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

And a script:

# Extract instrinsics from XML file
xsltproc data.xsl intel-intrinsics-3.3.15.xml > intel-intrinsics-3.3.15.csv
# Load intel intrinsics into an SQLite db
rm -f intrinsics.db
sqlite3 -batch intrinsics.db 2> /dev/null <<EOF
CREATE TABLE intrinsics(name TEXT NOT NULL UNIQUE, cpuid TEXT, instruction TEXT);
.separator ';'
.import intel-intrinsics-3.3.15.csv intrinsics
EOF

# Extract implemented intrinsics from Rust files
for cpuid in abm avx avx2 bmi bmi2 sse sse2 sse3 sse41 sse42 ssse3; do

rm -f $cpuid.csv
find coresimd/ -type f -name $cpuid.rs -print0 | xargs -0 grep -h '^#\[cfg_attr(.*assert_instr(\|pub unsafe fn' | sed -e 's/^#\[cfg_attr(.*assert_instr(\([^),]*\)[,)].*$/\1/' | sed -e 's/^pub unsafe fn \([^(]*\)(.*$/\1/' | awk '/^_/{print $0";"p; p=""}!/^_/{p=$0}' > $cpuid.csv
# Load them the SQLite db
sqlite3 -batch intrinsics.db <<EOF
CREATE TABLE $cpuid(name TEXT NOT NULL UNIQUE, instruction TEXT);
.separator ';'
.import $cpuid.csv $cpuid
-- find inconsistencies (or missing implementation)
select i.name, i.cpuid, i.instruction, s.instruction
from intrinsics i
left outer join $cpuid s on s.name = i.name
where i.cpuid like '$cpuid'
and i.instruction <> s.instruction
order by 1;
EOF

done

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions