GCC编译器移植到新架构:调用外部库函数

时间:2015-03-04 00:50:50

标签: c gcc compiler-construction porting cpu-architecture

我将GCC编译器移植到新的处理器架构中。它是v850架构(" / gcc / config / v850")的模拟器,差不多完成了。但我在乘法算术运算中遇到了问题。架构仅支持无符号乘法。在签名的情况下,我必须使用" __ mulsi3"来自lib1funcs.asm的库函数。所以我需要在签名时调用库函数。实施" mulsi3"说明如下。有谁知道如何从{target} .md文件或{target} .c文件中调用任何库函数?帮助我...

我跟着" sh"体系结构(" / gcc / config / sh")并像sh体系结构一样实现。 GCC构建好了。但是当我在目标上编译测试代码时,会出现一条错误消息。 (file => emit-rtl.c:862)


mulsi3指令

    (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")])

1 个答案:

答案 0 :(得分:5)

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中提出这些深入的问题。