Как насчет преобразования этого в C?
Похоже, код вычитает два числа (value - reg[base].I)
, сохраняет результат в reg[dest].I
и затем проверяет различные флаги.
Итак, что-то (грубо говоря, не проверено), например:
reg[dest].I = value - reg[base].I;
Z_FLAG = (reg[dest].I == 0);
N_FLAG = (reg[dest].I < 0);
/* repeat for: carry, overflow */
А затем позволить компилятору творить чудеса?ARM-компилятор gcc неплох в отображении такого рода вещей в правильные инструкции ARM.
Если вы хотите выполнить сборку ARM, вы, вероятно, смотрите на использование инструкций условного перемещения, что-то вроде (написал быстро - не проверял):
__asm__ (
"subs %[out], %[in2], %[in1]\n\t"
"movmi %[N_FLAG], #1\n\t"
"moveq %[Z_FLAG], #1\n\t"
"movcs %[C_FLAG], #1\n\t"
"movvs %[V_FLAG], #1\n\t"
: [N_FLAG]"+r"(N_FLAG), [Z_FLAG]"+r"(Z_FLAG), [C_FLAG]"+r"(C_FLAG), [V_FLAG]"+r"(V_FLAG), [out]"=r" (reg[dest].I)
: [in1]"r" (reg[base].I), [in2]"r"(value))
: "cc"
);