aarch64 g ++: MOV в __asm ​​перемещает только младшие 32 бита 64-битного значения - PullRequest
1 голос
/ 08 мая 2020

Я компилирую свой код для машины aarch64 с использованием arch64- linux -gnu-g ++ (версия 7.5.0) и стандартного набора C ++ 17. Мой код включает в себя следующее:

  uint64_t inRef = 0x ... ;  

  ...  

  __asm("MOV X8, %[input_i];"  
      :  
      : [input_i] "r" (inRef)  
      : "x8"  
  );

Я упаковываю значения в inRef и пытаюсь сохранить регистр X8 в значении inRef, который будет обработан позже в программе. Когда я распечатываю значение inRef, я могу подтвердить, что оно действительно содержит 64-битное значение.

Однако то, что я вижу при выполнении моей программы, заключается в том, что только нижние 32 бита inRef фактически передаются X8, хотя inRef - это uint64_t, а X8, будучи отдельным от системы aarch64, также является 64-битным. Я попытался изучить ограничивающий символ ("r"), но согласно документации, это должно относиться к 64-битному регистру [1]. Я также попытался сделать свой код более явным, как в [2], со следующим:

  register std::uint64_t x7 asm("x7") = 0x ... ;  

  ...  

  __asm__ volatile("MOV X8, %[input_i];"  
      :   
      : [input_i] "r" (x7)  
      : "x8"  
  );   

К сожалению, возникает та же ошибка. Я подтвердил, что моя машина на самом деле является машиной aarch64 и ее регистры X действительно 64-битные, поэтому я подозреваю, что проблема может быть в коде или компиляции. Таким образом, как мне полностью переместить 64-битную переменную в aarch64 в регистр?

Ссылки:
[1] http://infocenter.arm.com/help/topic/com.arm.doc.100067_0610_00_en/qjl1517569411293.html
[2] Android 64-битная встроенная сборка ARM Studio

...