Skip to content

Potential performance improvements for DSP-centric designs using numeric_std #1481

@malles030

Description

@malles030

There is quite some potential to notably speed up NVC for DSP-centric designs. Some of the numeric_std functions have JIT intrinsics (like unsigned comparisons) while many others have not (like signed comparisons). I wonder whether you are open to take pull requests implementing more of these functions as JIT intrinsics or whether there is something that would hold you back from accepting such pull requests? I'm aware that it would add quite a bit of code.

A first step could be to implement signed comparisons and the to_integer functions.

Here is the current status in NVC:

Id Funktion master
A.1 "abs"(SIGNED) return SIGNED
A.2 "-"(SIGNED) return SIGNED (unary)
A.3 "+"(UNSIGNED, UNSIGNED) return UNSIGNED
A.4 "+"(SIGNED, SIGNED) return SIGNED
A.5 "+"(UNSIGNED, NATURAL) return UNSIGNED
A.6 "+"(NATURAL, UNSIGNED) return UNSIGNED
A.7 "+"(INTEGER, SIGNED) return SIGNED
A.8 "+"(SIGNED, INTEGER) return SIGNED
A.9 "-"(UNSIGNED, UNSIGNED) return UNSIGNED
A.10 "-"(SIGNED, SIGNED) return SIGNED
A.11 "-"(UNSIGNED, NATURAL) return UNSIGNED
A.12 "-"(NATURAL, UNSIGNED) return UNSIGNED
A.13 "-"(SIGNED, INTEGER) return SIGNED
A.14 "-"(INTEGER, SIGNED) return SIGNED
A.15 "*"(UNSIGNED, UNSIGNED) return UNSIGNED
A.16 "*"(SIGNED, SIGNED) return SIGNED
A.17 "*"(UNSIGNED, NATURAL) return UNSIGNED
A.18 "*"(NATURAL, UNSIGNED) return UNSIGNED
A.19 "*"(SIGNED, INTEGER) return SIGNED
A.20 "*"(INTEGER, SIGNED) return SIGNED
A.21 "/"(UNSIGNED, UNSIGNED) return UNSIGNED
A.22 "/"(SIGNED, SIGNED) return SIGNED
A.23 "/"(UNSIGNED, NATURAL) return UNSIGNED
A.24 "/"(NATURAL, UNSIGNED) return UNSIGNED
A.25 "/"(SIGNED, INTEGER) return SIGNED
A.26 "/"(INTEGER, SIGNED) return SIGNED
A.27 "rem"(UNSIGNED, UNSIGNED) return UNSIGNED
A.28 "rem"(SIGNED, SIGNED) return SIGNED
A.29 "rem"(UNSIGNED, NATURAL) return UNSIGNED
A.30 "rem"(NATURAL, UNSIGNED) return UNSIGNED
A.31 "rem"(SIGNED, INTEGER) return SIGNED
A.32 "rem"(INTEGER, SIGNED) return SIGNED
A.33 "mod"(UNSIGNED, UNSIGNED) return UNSIGNED
A.34 "mod"(SIGNED, SIGNED) return SIGNED
A.35 "mod"(UNSIGNED, NATURAL) return UNSIGNED
A.36 "mod"(NATURAL, UNSIGNED) return UNSIGNED
A.37 "mod"(SIGNED, INTEGER) return SIGNED
A.38 "mod"(INTEGER, SIGNED) return SIGNED
C.1 ">"(UNSIGNED, UNSIGNED) return BOOLEAN
C.2 ">"(SIGNED, SIGNED) return BOOLEAN
C.3 ">"(NATURAL, UNSIGNED) return BOOLEAN
C.4 ">"(INTEGER, SIGNED) return BOOLEAN
C.5 ">"(UNSIGNED, NATURAL) return BOOLEAN
C.6 ">"(SIGNED, INTEGER) return BOOLEAN
C.7 "<"(UNSIGNED, UNSIGNED) return BOOLEAN
C.8 "<"(SIGNED, SIGNED) return BOOLEAN
C.9 "<"(NATURAL, UNSIGNED) return BOOLEAN
C.10 "<"(INTEGER, SIGNED) return BOOLEAN
C.11 "<"(UNSIGNED, NATURAL) return BOOLEAN
C.12 "<"(SIGNED, INTEGER) return BOOLEAN
C.13 "<="(UNSIGNED, UNSIGNED) return BOOLEAN
C.14 "<="(SIGNED, SIGNED) return BOOLEAN
C.15 "<="(NATURAL, UNSIGNED) return BOOLEAN
C.16 "<="(INTEGER, SIGNED) return BOOLEAN
C.17 "<="(UNSIGNED, NATURAL) return BOOLEAN
C.18 "<="(SIGNED, INTEGER) return BOOLEAN
C.19 ">="(UNSIGNED, UNSIGNED) return BOOLEAN
C.20 ">="(SIGNED, SIGNED) return BOOLEAN
C.21 ">="(NATURAL, UNSIGNED) return BOOLEAN
C.22 ">="(INTEGER, SIGNED) return BOOLEAN
C.23 ">="(UNSIGNED, NATURAL) return BOOLEAN
C.24 ">="(SIGNED, INTEGER) return BOOLEAN
C.25 "="(UNSIGNED, UNSIGNED) return BOOLEAN
C.26 "="(SIGNED, SIGNED) return BOOLEAN
C.27 "="(NATURAL, UNSIGNED) return BOOLEAN
C.28 "="(INTEGER, SIGNED) return BOOLEAN
C.29 "="(UNSIGNED, NATURAL) return BOOLEAN
C.30 "="(SIGNED, INTEGER) return BOOLEAN
C.31 "/="(UNSIGNED, UNSIGNED) return BOOLEAN
C.32 "/="(SIGNED, SIGNED) return BOOLEAN
C.33 "/="(NATURAL, UNSIGNED) return BOOLEAN
C.34 "/="(INTEGER, SIGNED) return BOOLEAN
C.35 "/="(UNSIGNED, NATURAL) return BOOLEAN
C.36 "/="(SIGNED, INTEGER) return BOOLEAN
S.1 SHIFT_LEFT(UNSIGNED, NATURAL)
S.2 SHIFT_RIGHT(UNSIGNED, NATURAL)
S.3 SHIFT_LEFT(SIGNED, NATURAL)
S.4 SHIFT_RIGHT(SIGNED, NATURAL)
S.5 ROTATE_LEFT(UNSIGNED, NATURAL)
S.6 ROTATE_RIGHT(UNSIGNED, NATURAL)
S.7 ROTATE_LEFT(SIGNED, NATURAL)
S.8 ROTATE_RIGHT(SIGNED, NATURAL)
S.9 "sll"(UNSIGNED, INTEGER)
S.10 "sll"(SIGNED, INTEGER)
S.11 "srl"(UNSIGNED, INTEGER)
S.12 "srl"(SIGNED, INTEGER)
S.13 "rol"(UNSIGNED, INTEGER)
S.14 "rol"(SIGNED, INTEGER)
S.15 "ror"(UNSIGNED, INTEGER)
S.16 "ror"(SIGNED, INTEGER)
R.1 RESIZE(SIGNED, NATURAL) return SIGNED
R.2 RESIZE(UNSIGNED, NATURAL) return UNSIGNED
D.1 TO_INTEGER(UNSIGNED) return NATURAL
D.2 TO_INTEGER(SIGNED) return INTEGER
D.3 TO_UNSIGNED(NATURAL, NATURAL) return UNSIGNED
D.4 TO_SIGNED(INTEGER, NATURAL) return SIGNED
L.1 "not"(UNSIGNED)
L.2 "and"(UNSIGNED, UNSIGNED)
L.3 "or"(UNSIGNED, UNSIGNED)
L.4 "nand"(UNSIGNED, UNSIGNED)
L.5 "nor"(UNSIGNED, UNSIGNED)
L.6 "xor"(UNSIGNED, UNSIGNED)
L.7 "xnor"(UNSIGNED, UNSIGNED)
L.8 "not"(SIGNED)
L.9 "and"(SIGNED, SIGNED)
L.10 "or"(SIGNED, SIGNED)
L.11 "nand"(SIGNED, SIGNED)
L.12 "nor"(SIGNED, SIGNED)
L.13 "xor"(SIGNED, SIGNED)
L.14 "xnor"(SIGNED, SIGNED)
T.1 TO_01(UNSIGNED, STD_LOGIC) return UNSIGNED
T.2 TO_01(SIGNED, STD_LOGIC) return SIGNED

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions