Генерация расширенного компилятора в ASIPmeister - PullRequest
0 голосов
/ 01 декабря 2018

Я использую инструмент 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 в качестве возвращаемых значений, но в коде сборки онив дальнейшем не используются где-либо для сохранения в массив.Есть ли ошибка в использовании?Есть ли альтернатива или предложения.С уважением

Страница, относящаяся к Руководству по инструменту: Tool Manual's Relevant Page C В инструмент добавлено определение:

C Definition added in the tool Инструкции:

Instructions

...