register int16_t *samples = mono_samples;
    do {
        int16_t left = *samples++;
        /* force gcc to update the pointer and use pre-indexing */
        asm ("" : "+r"(samples) : : "memory" );
        *samples++ = left;
    } while(samples != end);
    mono_samples = samples;


VS


    int16_t left;
    asm (
        "1: ldrh %0, [%1], #2   \n"
        "   strh %0, [%1], #2   \n"
        "   cmp %1, %2          \n"
        "   bne  1b             \n"
    : "=r"(left), "+r"(mono_samples)
    : "r"(end)
    : "memory"
    );