在ASIPmeister中生成扩展的编译器

时间:2018-12-01 14:59:58

标签: gcc assembly inline-assembly

我正在使用ASIPmeister工具通过向处理器添加新指令来自定义基本处理器。如果在工具中添加了新指令的C定义,则工具本身会生成相应的编译器。我添加了AVERAGE,SWAP,MINMAX和BRANCH_IF_GREAT_THAN_OR_EQUAL_TO C定义,如所附图片所示。 该工具手册指出,所有新指令都应具有C定义,如附图所示,然后可以使用关键字__builtin_browni32_XXX进行访问。它还说所有返回0或1个以上操作数的指令都应返回void类型,并且引用返回1个以上的值。现在,将我的AVG,SWAP和XNOR返回一个值添加到了编译器中,我可以按照下面的代码(带注释的行)正确访问它们,但是在C代码中使用BGUE和MINMAX指令时遇到了问题。我尝试了以下方法:

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

0 个答案:

没有答案