The Beautiful Future

cross product 분석 본문

arm assembly

cross product 분석

Small Octopus 2019. 3. 9. 13:23
inline __attribute__((always_inline)) void cross3_neon_vld3_vst3_asm_4x(float const* v1, float const* v2, float* result) {
    unsigned int const offset = 16; // 128-bit vectors

    asm volatile(
        "vld3.f32 {d0[0], d2[0], d4[0]}, [%[v1]], %[offset]         \n\t"
        "vld3.f32 {d0[1], d2[1], d4[1]}, [%[v1]], %[offset]         \n\t"
        "vld3.f32 {d1[0], d3[0], d5[0]}, [%[v1]], %[offset]         \n\t"
        "vld3.f32 {d1[1], d3[1], d5[1]}, [%[v1]], %[offset]         \n\t"
        "vld3.f32 {d16[0], d18[0], d20[0]}, [%[v2]], %[offset]      \n\t"
        "vld3.f32 {d16[1], d18[1], d20[1]}, [%[v2]], %[offset]      \n\t"
        "vld3.f32 {d17[0], d19[0], d21[0]}, [%[v2]], %[offset]      \n\t"
        "vld3.f32 {d17[1], d19[1], d21[1]}, [%[v2]], %[offset]      \n\t"
        "vmul.f32 q12, q1, q10                                      \n\t"
        "vmul.f32 q13, q2, q8                                       \n\t"
        "vmul.f32 q14, q0, q9                                       \n\t"        
        "vmls.f32 q12, q2, q9                                       \n\t"
        "vmls.f32 q13, q0, q10                                      \n\t"
        "vmls.f32 q14, q1, q8                                       \n\t"        
        "vst3.f32 {d24[0], d26[0], d28[0]}, [%[result]], %[offset]  \n\t"
        "vst3.f32 {d24[1], d26[1], d28[1]}, [%[result]], %[offset]  \n\t"
        "vst3.f32 {d25[0], d27[0], d29[0]}, [%[result]], %[offset]  \n\t"
        "vst3.f32 {d25[1], d27[1], d29[1]}, [%[result]], %[offset]"        
        : [v1] "=r" (v1), [v2] "=r" (v2), [result] "=r" (result)
        : "0" (v1), "1" (v2), "2" (result), [offset] "r" (offset)
        : "memory", "q0", "q1", "q2", "q8", "q9", "q10", "q12", "q13", "q14"
    );
}

'arm assembly' 카테고리의 다른 글

명령어 정리  (0) 2019.05.18
ARM GCC Inline Assembler Cookbook  (0) 2019.03.10
NEON Register 구조  (0) 2019.03.08
어셈작성법 구조  (0) 2019.03.06
Comments