вернуть поплавки в цель-c из функции сборки руки

Я написал функцию сборки, которая отлично работает на iPhone 4 (32-битный код), а также на iPhone 6s (64-битный код). Я передаю четыре числа с плавающей точкой из вызывающей функции в target-c.

Вот структура, которую я использую для 4-х чисел с плавающей запятой, и ниже, которая является прототипом для функции - как показано в верхней части моего кода target-c.

struct myValues{    // This is a structure.  It is used to conveniently group multiple data items logically.
    float A;        // I am using it here because i want to return multiple float values from my ASM code
    float B;        // They get passed in via S0, S1, S2 etc. and they come back out that way too
    float number;
    float divisor;  //gonna be 2.0
}myValues;

struct myValues my_asm(float e, float f, float g, float h);  //  Prototype for the ASM function

Внизу в моем коде target-c я вызываю свою функцию сборки следующим образом:

myValues = my_asm(myValues.A, myValues.B, myValues.number,myValues.divisor);   // ASM function

При работе с iPhone 6S код работает как чемпион (64-битный код). 4 значения с плавающей запятой передаются из кода target-c в код сборки через регистры ARM с одним плавающим числом S0-S4. Возвращенные результаты также передаются через S0-S4.

При работе с iPhone 4 код также работает нормально (32-битный код). 4 значения с плавающей запятой передаются из кода obj-c в код сборки через регистры ARM с одиночной плавающей запятой S0, S2, S4 и S6 (не знаю, почему пропускаются нечетные регистры). Код работает нормально, но значения, которые возвращаются в мою структуру obj-c, являются мусором.

Где / как я могу передать значения с плавающей запятой из 32-битного кода ARM, чтобы они возвращались в структуру obj-c?

спасибо, relayman357

постскриптум Ниже мой код сборки из моего файла Xcode S.

.ios_version_min 9, 0
.globl  _my_asm
.align  2

#ifdef __arm__
.thumb_func _my_asm
.syntax unified
.code 16

_my_asm:                   // 32 bit code
// S0 = A, S2 = B, S4 = Number, S6 = 2.0   - parameters passed in when called by the function
vadd.f32 s0, s0, s2 
vdiv.f32 s0, s0, s6   
vdiv.f32 s1, s4, s0   
vcvt.u32.f32 r0,s0
bx lr
//ret

#else
_my_asm:                  // 64 bit code
//add W0, W0, W1
; S0 = A, S1 = B, S2 = Number, S3 = 2.0  parameters passed in when called by the function
fadd s0, s0, s1  
fdiv s0, s0, s3  
fdiv s1, s2, s0  
ret

#endif

Ответы на вопрос(1)

Ваш ответ на вопрос