c++ 使用JNI类型,如带有arm neon 内联汇编的jint-ARM 64上的编译错误

uqjltbpv  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(98)

我对内联汇编知之甚少,代码(详情请参见here)如下:

JNIEXPORT void JNICALL
Java_com_xingin_xarengine_RGBAToGrayRenderer_nCopy(JNIEnv *env, jclass clazz, jobject dstBuf,
                                                   jobject srcBuf, jint sz) {
    if(sz & 63){
        sz = (sz & -64) + 64;
    }

    auto dst = (uint8_t volatile*)env->GetDirectBufferAddress(dstBuf);
    auto src = (uint8_t volatile*)env->GetDirectBufferAddress(srcBuf);
    asm volatile (
    "NEONCopyPLD: \n"
    " VLDM %[src]!,{d0-d7} \n"
    " VSTM %[dst]!,{d0-d7} \n"
    " SUBS %[sz],%[sz],#0x40 \n"
    " BGT NEONCopyPLD \n"
    : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
    LOGD("Use neon registers for memory copy");
}

它基本上是用来通过 neon 寄存器复制内存的。而编译器在构建我的应用程序时抱怨:

Build command failed.
Error while executing process /Users/user/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja with arguments {-C /Users/user/Projects/XarEngine/android/arview/.cxx/Release/5s3f6f2r/arm64-v8a XarEngine}
ninja: Entering directory `/Users/user/Projects/XarEngine/android/arview/.cxx/Release/5s3f6f2r/arm64-v8a'
[1/2] Building CXX object CMakeFiles/XarEngine.dir/XarEngine/details.cpp.o
FAILED: CMakeFiles/XarEngine.dir/XarEngine/details.cpp.o 
/Users/user/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/user/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/user/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot  -DXarEngine_EXPORTS -D__GIT_TAG__=\"1.3.3-7-g59b0706\" -I../../../../../../components/PlaneTracker/include -I../../../../../../thirdparty/rapidjson -I../../../../../../thirdparty/filament/include -I../../../../../../thirdparty/opencv_4.5.3/include -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -s -O2 -O2 -DNDEBUG  -fPIC -MD -MT CMakeFiles/XarEngine.dir/XarEngine/details.cpp.o -MF CMakeFiles/XarEngine.dir/XarEngine/details.cpp.o.d -o CMakeFiles/XarEngine.dir/XarEngine/details.cpp.o -c ../../../../../../XarEngine/details.cpp
clang++: warning: argument unused during compilation: '-s' [-Wunused-command-line-argument]
../../../../../../XarEngine/details.cpp:175:48: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
    : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
                                               ^
../../../../../../XarEngine/details.cpp:173:12: note: use constraint modifier "w"
    " SUBS %[sz],%[sz],#0x40 \n"
           ^~~~~
           %w[sz]
../../../../../../XarEngine/details.cpp:175:48: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
    : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
                                               ^
../../../../../../XarEngine/details.cpp:173:18: note: use constraint modifier "w"
    " SUBS %[sz],%[sz],#0x40 \n"
                 ^~~~~
                 %w[sz]
../../../../../../XarEngine/details.cpp:171:6: error: vector register expected
    " VLDM %[src]!,{d0-d7} \n"
     ^
<inline asm>:2:12: note: instantiated into assembly here
 VLDM x0!,{d0-d7} 
           ^
../../../../../../XarEngine/details.cpp:172:6: error: vector register expected
    " VSTM %[dst]!,{d0-d7} \n"
     ^
<inline asm>:3:13: note: instantiated into assembly here
 VSTM x21!,{d0-d7} 
            ^
2 warnings and 2 errors generated.
ninja: build stopped: subcommand failed.

谁能帮我弄清楚以上信息?

更新

这和编译器有关吗?我的编译器是clang的,而上面的内联汇编应该是gcc兼容的

mutmk8jj

mutmk8jj1#

post的副本。正如@PeterCordes所说,以上内联程序集只能为32位ARM编译

相关问题