aarch64 assembly inline 4x4 matrix transpose

使用ZIP1和ZIP2指令完成。

/**

*@brief only test 4x4

*/

void transpose_neon_4x4(float *src, float *dst) {

asm volatile (

    "ldr q0, [%[src]]\n"          // a0123

    "ldr q1, [%[src], #16]\n"    // b0123

    "ldr q2, [%[src], #32]\n"    // c0123

    "ldr q3, [%[src], #48]\n"    // d0123

    // zip1: get upper half and interleave store

    "zip1 v4.4s, v0.4s, v2.4s\n"  // a0c0a1c1

    "zip1 v5.4s, v1.4s, v3.4s\n"  // b0d0b1d1

    // zip2: get lower half and interleave

    "zip2 v6.4s, v0.4s, v2.4s\n"  // a2c2a3c3

   "zip2 v7.4s, v1.4s, v3.4s\n"  // b2d2b3d3

    // transpose part

    "zip1 v0.4s, v4.4s, v5.4s\n"  // a0b0c0d0

    "zip2 v1.4s, v4.4s, v5.4s\n"  // a1b1c1d1

    "zip1 v2.4s, v6.4s, v7.4s\n"  // a2b2c2d2

    "zip2 v3.4s, v6.4s, v7.4s\n"  // a3b3c3d3

    "str q0, [%[dst]]\n"

    "str q1, [%[dst], #16]\n"

    "str q2, [%[dst], #32]\n"

    "str q3, [%[dst], #48]\n"

    : [src] "+r" (src),

      [dst] "+r" (dst)

    :

    : "v0", "v1", "v2", "v3",

      "v4", "v5", "v6", "v7",

      "memory"

  );

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容