Нет qsort_r для Android (или как отключить принудительное использование Thumb CLZ в коде Android ARM)

Что я хочу сделать (высокий уровень): использовать qsort_r на Android.

Реализации по умолчанию нет. Итак, я взял один из BSD. К сожалению, ему нужны функции fls, которые также недоступны на Android. Поэтому я взял библиотеку Apple Open Source Libc и скопировал реализацию ARM во встроенную сборку. Теперь я получаю это:

Assembler messages:
Error: selected processor does not support Thumb mode `clz r3,r0'
Error: cannot honor width suffix -- `rsb r0,r3,#32'

AFAIR ARM-6 не поддерживает его в режиме большого пальца. Итак, как я могу принудительно использовать режим без большого пальца для этого одного файла, или для fls доступна реализация на чистом C?

(и Боже, почему я должен играть на таком низком уровне только для того, чтобы иметь qsort_r...)


person Wojtek    schedule 25.12.2012    source источник
comment
В вашем файле Android.mk добавьте .arm к именам файлов, и они будут скомпилированы в режиме ARM, а не в режиме Thumb (например, sort.c.arm). У меня был смешанный код Thumb/ARM в собственной библиотеке Android, и он работал нормально.   -  person BitBank    schedule 26.12.2012
comment
@BitBank Пожалуйста, сделайте это ответом, чтобы я мог проголосовать за него.   -  person Wojtek    schedule 16.09.2013


Ответы (1)


В вашем файле Android.mk показано, как настроить компиляцию версий вашего кода для большого пальца, руки и неона. Исходные файлы на ассемблере должны иметь заглавную букву «S» в make-файле, но фактическое имя не должно быть заглавным. Суффиксы «.arm» и «.arm.neon» присутствуют только в make-файле и не являются частью имени (например, файлы ниже называются main.c, main_asm.s, test.c и test_asm.s).

LOCAL_ARM_MODE := arm  # remove this if you want thumb mode
LOCAL_ARM_NEON := true # remove this if you want armv5 mode

# this flag will allow neon intrinsics in your C files
LOCAL_CFLAGS := -mfpu=neon -march=armv7

LOCAL_SRC_FILES := \
          main.c.arm \
          test.c.arm.neon \
          main_asm.S.arm \
          test_asm.S.arm.neon \
person BitBank    schedule 16.09.2013