cg_assemblers.e07

来自「realview22.rar」· E07 代码 · 共 310 行 · 第 1/5 页

E07
310
字号
      SMLAL lo64(sum), hi64(sum), a, b
    }
#else
    sum += (__int64) a * (__int64) b;
#endif
    return sum;
}

__int64 dotprod(int *a, int *b, unsigned n)
{
    __int64 sum = 0;
    do
        sum = mlal(sum, *a++, *b++);
    while (--n != 0);
    return sum;
}
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int main(void)
{
    printf("Dotproduct %lld (should be %d)\n", dotprod(a, b, 10),
220);
    return 0;
}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></example><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></sect4><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></sect3><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></sect2>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1400448><sect2 id = "CHDGDDCJ"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1400451><title>Restrictions on inline assembly operations<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></title>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1447096><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1457658><indexterm>There are a number of restrictions on the operations
that can be performed in inline assembly code. These restrictions
provide a measure of safety, and ensure that the assumptions in
compiled C and C++ code are not violated in the assembled assembly code.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1447119><para>The restrictions are described in the following sections:
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476153><itemizedlist role = "standard"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476156><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476159><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476162><xref
    linkend = "CIHBAJEH"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476169><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476172><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476175><xref linkend = "CIHIDFHH"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476182><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476185><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476188><xref linkend = "CIHGJGCF"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476195><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476198><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476201><xref linkend = "CIHDEEJA"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476208><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476211><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476214><xref linkend = "CIHEDEAD"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476221><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476224><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1476227><xref linkend = "CIHHEIJG">.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453754><sect3 id = "CIHBAJEH"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453758><title>Miscellaneous restrictions<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></title>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453766><para>The inline assembler has the following restrictions:
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453774><itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456323><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456467><para>The inline assembler is a high-level assembler, and
the code it generates might not always be exactly what you write.
Do not use it to generate more efficient code than the compiler
generates. Use the ARM assembler <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456471><command>armasm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></command> for this
purpose.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456345><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456487><para>Some low-level features that are available in the
ARM assembler <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456490><command>armasm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></command>, such as branching and writing
to PC, are not supported.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456367><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456507><para>Label expressions are not supported.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456389><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456392><para>You cannot get the address of the current instruction
using dot notation (.) or <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1456395><literal>{PC}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal>.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453872><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453875><para>The <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453878><literal>&#38;<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal> operator cannot be
used to denote hexadecimal constants. Use the <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453882><literal>0x<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal> prefix instead.
For example:<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453888><literallayout>__asm {AND x, y, 0xF00}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literallayout><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453894><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453897><para>The notation to specify the actual rotate of an
8-bit constant is not available in inline assembly language. This
means that where an 8-bit shifted constant is used, the C flag must
be regarded as corrupted if the NZCV flags are updated.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453937><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1453940><para>You must not modify the stack. This is not necessary
because the compiler stacks and restores any working registers as
required automatically. It is not permitted to explicitly stack
and restore work registers.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?