Сборка ARM NEON на Windows Phone 8 не работает

Я пытаюсь вызвать функцию, закодированную в сборке ARM NEON, в файле .s, который выглядит так:

  AREA myfunction, code, readonly, ARM
  global fun
  align 4
fun
  push  {r4, r5, r6, r7, lr}
  add r7, sp, #12
  push  {r8, r10, r11}
  sub r4, sp, #64
  bic r4, r4, #15
  mov sp, r4
  vst1.64 {d8, d9, d10, d11}, [r4]!
  vst1.64 {d12, d13, d14, d15}, [r4]
  [....] 

а собираю так:

armasm.exe -32 func.s func.obj

К сожалению, это не работает, и я получаю исключение недопустимой инструкции, когда пытаюсь вызвать функцию. Когда я использовал dumpbin.exe для дизассемблирования .obj, он дизассемблировался так, как если бы это был код Thumb, несмотря на директиву ARM в сборке (см. код выше).

Я подозреваю, что функция вызывается в режиме Thumb, и предполагается, что все функции по умолчанию находятся в режиме Thumb в Windows. Однако не могу найти никакой информации об этом.

Кто-нибудь знает, что здесь происходит?

РЕДАКТИРОВАТЬ: это происходит и на Microsoft Surface.


person Anthony Blake    schedule 21.11.2012    source источник
comment
Ах, глупый вопрос: почему вы думаете, что ARM Neon поддерживается на WP8? Я не видел ничего, говорящего о том, что он поддерживается на WP8...   -  person JustinAngel    schedule 21.11.2012
comment
armasm.exe пожаловался на несколько вещей, которые я исправил, но он не выдавал никаких предупреждений о NEON, и 95% ошибок были NEON.   -  person Anthony Blake    schedule 21.11.2012
comment
Я не знаю о WP8, но я слышал, что WinRT поддерживает только код Thumb2 (даже если процессор принимает ARM). А почему нельзя собрать как Thumb2?   -  person Igor Skochinsky    schedule 21.11.2012
comment
Какая инструкция генерирует исключение? Кроме того, как выглядит возврат? При возвращении с функции нужно восстановить режим.   -  person Peter M    schedule 14.02.2013


Ответы (2)


VS 2012 по умолчанию создает код большого пальца как для Windows RT, так и для Windows Phone 8, поэтому полученная вами ошибка, вероятно, вызвана вызовом кода руки из кода большого пальца. У вас есть два варианта:
1. Переключитесь из режима большого пальца в режим руки перед вызовом вашей функции (вы можете использовать для этого инструкцию BX asm) или
2. Вы можете попробовать переписать свой код NEON на C++, используя ARM Встроенные функции /NEON — они поддерживаются VS 2012. Просто добавьте «arm_neon.h», и все готово.
Справочник по встроенным функциям ARM можно найти по следующей ссылке: http://msdn.microsoft.com/en-us/library/hh875058.aspx
Для проверки ссылки на встроенные функции NEON по этой ссылке: http://infocenter.arm.com/help/topic/com.arm.doc.dui0491c/DUI0491C_arm_compiler_reference.pdf

Эти встроенные функции NEON из приведенной выше ссылки обычно поддерживаются VS 2012, хотя могут быть небольшие различия — если вы не уверены, проверьте включение «arm_neon.h», чтобы узнать.

person Docent    schedule 17.02.2013
comment
Да, в итоге я использовал встроенные функции, но этот код не такой быстрый, как сборка, потому что я использую такие встроенные функции, как VSWP, которые не сопоставляются со встроенными функциями. - person Anthony Blake; 26.02.2013
comment
Кроме того, ассемблер, похоже, не собирал код ARM — он, похоже, застрял в режиме ARMCE, что бы это ни было. - person Anthony Blake; 26.02.2013

Вы можете начать свой ассемблерный код с инструкции bx в режиме Thumb и просто перейти к части ARM в том же исходном файле.

И вам не нужно переключаться обратно в режим Thumb в конце, так как вы все равно завершите функцию ARM в bx или pop {pc}, что сделает переключение автоматически.

Мой ответ WAAAAAAY запоздал, но мне очень любопытно, работает ли он на WP. (у меня их нет)

person Jake 'Alquimista' LEE    schedule 08.07.2013
comment
Все еще любопытно? См. здесь. Короче, нет. - person Seva Alekseyev; 18.09.2013