Я использую инструмент ASIPmeister для настройки базового процессора, добавляя новые инструкции к процессору.И затем инструмент сам генерирует соответствующий компилятор, если в инструмент добавлено определение C новой инструкции.Я добавил определения AVERAGE, SWAP, MINMAX и BRANCH_IF_GREAT_THAN_OR_EQUAL_TO C, как на прилагаемой картинке.В руководстве по инструменту говорится, что все новые инструкции должны иметь определения C, как на прилагаемом рисунке, и затем к ним можно будет обратиться по ключевому слову __builtin_browni32_XXX.В нем также говорится, что все инструкции, которые возвращают 0 или более 1 операндов, должны возвращать тип void и более 1 значения возвращаются по ссылке.Теперь мои AVG, SWAP и XNOR, которые возвращают одно значение, добавляются в компилятор, и я могу получить к ним доступ должным образом, как в приведенном ниже коде (закомментированные строки), но у меня возникли проблемы с использованием команд BGUE и MINMAX в коде C.Я пробовал следующее:
unsigned int array[10] = { 45, 75,0,0,0,0,0,0,0};
int main() {
//array[2] = __builtin_brownie32_NXOR(array[0], array[1]);
//array[3] = __builtin_brownie32_AVG(array[0], array[1]);
//array[4] = __builtin_brownie32_SWAP(array[0]);
__builtin_brownie32_MINMAX(&array[5],&array[6], array[0], array[1]);
return 0;
}
, который дает следующий код сборки:
.globl _array
.data
.align 2
.type _array, @object
.size _array, 40
_array:
.long 45
.long 75
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.zero 4
.text
.align 2
.globl _main
.type _main, @function
_main:
; Function 'main'; 0 bytes of locals, 0 regs to save, 0 byte of out. args. size.
sw -4(r5),r3 ; push LinkRegister(r3)
sw -8(r5),r4 ; push FrameRegister(r4)
addi r4, r5,#-8 ; FramePtr = StackPtr-8
addi r5,r5,#-8 ; alloc local storage
addi r6,r0,%hi(_array+20)
lsoi r6,r6,%lo(_array+20)
add r8,r0,r6
addi r6,r0,%hi(_array+24)
lsoi r6,r6,%lo(_array+24)
add r9,r0,r6
addi r6,r0,%hi(_array)
lsoi r6,r6,%lo(_array)
lw r6,(r6)
nop
add r7,r0,r6
addi r6,r0,%hi(_array)
lsoi r6,r6,%lo(_array)
lw r6,4(r6)
nop
MINMAX r8 , r9 , r7 , r6
addi r6,r0,#0
lw r3,4(r4) ; pop LinkRegister(r3)
addi r5,r4,#8 ; StackPointer = FramePointer+8
lw r4,(r4) ; restore FramePointer
jpr r3 ; return
.size _main, .-_main
.ident "GCC: (GNU) 4.2.2"
Этот код сборки указывает, что MINMAX использует r8 и r9 в качестве возвращаемых значений, но в коде сборки онив дальнейшем не используются где-либо для сохранения в массив.Есть ли ошибка в использовании?Есть ли альтернатива или предложения.С уважением
Страница, относящаяся к Руководству по инструменту: C В инструмент добавлено определение:
Инструкции: