我正在使用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作为返回值,但是在汇编代码中,它们在存储到数组的任何位置都不再使用。 使用上有任何错误吗?是否有其他选择或建议。 问候