dee*_*man 6 c compiler-construction gcc porting cpu-architecture
我正在将GCC编译器移植到新的处理器架构中.它是v850架构("/ gcc/config/v850")的similer,差不多完成了.但我在乘法算术运算中遇到了问题.架构仅支持无符号乘法.在签名的情况下,我必须使用lib1funcs.asm中的"__mulsi3"库函数.所以我需要在签名时调用库函数.实施"mulsi3"指令如下.有谁知道如何从{target} .md文件或{target} .c文件调用任何库函数?帮我...
我遵循"sh"架构("/ gcc/config/sh")并实现了类似sh架构.GCC构建好了.但是当我在目标上编译测试代码时,会出现一条错误消息.(file => emit-rtl.c:862)
(define_insn "mulsi3"
[(set (match_operand:SI 0 "register_operand" "=r,r")
(mult:SI (match_operand:SI 1 "nonmemory_operand" "r,r")
(match_operand:SI 2 "nonmemory_operand" "r,i")))]
""
"*
{
/* REG */
if(GET_CODE (operands[2]) == REG)
{
return \"mul %0,%1,%2\";
}
/* IMMEDIATE */
else
{
/* unsigned case */
if(CONST_OK_FOR_M(INTVAL(operands[2])))
{
return \"muli %0,%1,%2\";
}
/* signed case */
else
{
/******************************************/
/* need to call __mulsi3 library function */
/******************************************/
}
}
}
"
[(set_attr "length" "6,6")
(set_attr "cc" "none_0hit,none_0hit")
(set_attr "type" "mult")])
Run Code Online (Sandbox Code Playgroud)
mulsi3是特别的名字.只有当它们非常简单时,你才可以将它赋予insn模式.
真的在你的情况下mulsi3模式应该是define_expand,然后你可以使它在某些分支上失败(使用显式的FAIL语句).当专门的扩展模式失败时,编译器应该生成libgcc调用.
但还有两个更正:
1)首选模式匹配到显式if-else内部模式.即写出单独的= r,r,r和= r,r,i指令模式,通过谓词和约束来约束允许的范围.编译器应该生成libgcc调用,如果它找不到适合的模式,你不需要(在大多数情况下,这是个坏主意)明确写入FAIL.
2)注意谓词/约束匹配."非内存操作数"对于"r,r"来说是非常糟糕的谓词.比如说,你在这里有合法的常数,你的程序很大,重新加载无法找到注册......一切都爆炸了.
我还建议您在gcc@gcc.gnu.org maillist中提出这些深入的问题.