龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 23181|回复: 55

FPC的移植总算有所进展了

  [复制链接]
发表于 2007-6-9 14:09:43 | 显示全部楼层 |阅读模式
第一步是实现了交叉编译器。
第二步现在是使用在龙芯上运行的非交叉编译器编译生成了hello的目标代码,并成功运行。
 楼主| 发表于 2007-6-9 14:10:13 | 显示全部楼层
.file "k_hello.pas"

.section .text

.section .text
        .balign 4
        .balign 4
# [k_hello.pas]
# [4] begin
.globl  PASCALMAIN
PASCALMAIN:
.globl  main
main:
# Temps allocated between $fp+0 and $fp+0
        .set    noreorder
        .set    nomacro
        sw      $fp,-8($sp)
        sw      $31,-4($sp)
        move    $fp,$sp
        addiu   $sp,$sp,-8
        jal     FPC_INITIALIZEUNITS
        nop
# [5] b := 1000;
        addiu   $4,$0,1000
        lui     $5,%hi(U_P$K_HELLO_B)
        sw      $4,%lo(U_P$K_HELLO_B)($5)
# [6] c := 2000;
        addiu   $4,$0,2000
        lui     $5,%hi(U_P$K_HELLO_C)
        sw      $4,%lo(U_P$K_HELLO_C)($5)
# [7] a := b + c;
        lui     $4,%hi(U_P$K_HELLO_B)
        lw      $5,%lo(U_P$K_HELLO_B)($4)
        lui     $4,%hi(U_P$K_HELLO_C)
        lw      $4,%lo(U_P$K_HELLO_C)($4)
        addu    $4,$4,$5
        lui     $5,%hi(U_P$K_HELLO_A)
        sw      $4,%lo(U_P$K_HELLO_A)($5)
# [9] Kwritestr('Hello!');
        lui     $4,%hi(_$PROGRAM$_L11+1)
        addiu   $4,$4,%lo(_$PROGRAM$_L11+1)
        jal     SYSTEM_KWRITESTR$PCHAR
        nop
# [10] Kwriteln;
        jal     SYSTEM_KWRITELN
        nop
# [11] end.
        jal     FPC_DO_EXIT
        nop
        lw      $fp,0($sp)
        lw      $31,4($sp)
        addiu   $sp,$sp,8
        j       $31
        nop
        .set    macro
        .set    reorder
.Le0:
        .size   main, .Le0 - main
        .balign 4

.section .data
# [12]
        .ascii  "FPC 2.0.0 [2007/06/09] for fvm32 - Linux"
        .balign 8
        .balign 8
.globl  THREADVARLIST_P$K_HELLO
THREADVARLIST_P$K_HELLO:
        .long   0
.Le1:
        .size   THREADVARLIST_P$K_HELLO, .Le1 - THREADVARLIST_P$K_HELLO
        .balign 4
.globl  FPC_THREADVARTABLES
FPC_THREADVARTABLES:
        .long   2
        .long   THREADVARLIST_SYSTEM
        .long   THREADVARLIST_P$K_HELLO
.Le2:
        .size   FPC_THREADVARTABLES, .Le2 - FPC_THREADVARTABLES
        .balign 4
.globl  FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
        .long   0
.Le3:
        .size   FPC_RESOURCESTRINGTABLES, .Le3 - FPC_RESOURCESTRINGTABLES
        .balign 4
.globl  INITFINAL
INITFINAL:
        .long   1,0
        .long   INIT$_SYSTEM
        .long   0
.Le4:
        .size   INITFINAL, .Le4 - INITFINAL
        .balign 4
.globl  __stklen
__stklen:
        .long   8000000
.globl  __heapsize
__heapsize:
        .long   0

.section .data

.section .data
        .balign 4
.globl  _$PROGRAM$_L11
_$PROGRAM$_L11:
        .ascii  "\006Hello!\000"

.section .data

.section .data

.section .bss

.section .bss
        .balign 4
# [3] a, b, c: longint;
        .lcomm  U_P$K_HELLO_A,4

.section .bss
        .balign 4
        .lcomm  U_P$K_HELLO_B,4

.section .bss
        .balign 4
        .lcomm  U_P$K_HELLO_C,4
 楼主| 发表于 2007-6-9 14:11:09 | 显示全部楼层
program k_hello;
var
  a, b, c: longint;
begin
  b := 1000;
  c := 2000;
  a := b + c;

  Kwritestr('Hello!');
  Kwriteln;
end.
 楼主| 发表于 2007-6-9 14:16:10 | 显示全部楼层
FPC编译器是用Free Pascal写的,完全不使用gcc.
FPC编译器生成“.s”文件
再自动调用as和ld,完成汇编和连接。
发表于 2007-6-9 14:19:13 | 显示全部楼层
Good
发表于 2007-6-9 14:42:49 | 显示全部楼层
呵呵 寄存器选择还要优化啊 否则老是在那读写内存 体现不出risc的多寄存器的优势啊
 楼主| 发表于 2007-6-9 14:52:33 | 显示全部楼层
原帖由 water 于 2007-6-9 02:42 PM 发表
呵呵 寄存器选择还要优化啊 否则老是在那读写内存 体现不出risc的多寄存器的优势啊

嘿,老手啊!
这个就是FPC的主要弱点。
要慢慢研究了。
主要的流行办法是生成一种中间语言,再对这个中间语言进行优化。
 楼主| 发表于 2007-6-9 14:53:10 | 显示全部楼层
原帖由 water 于 2007-6-9 02:19 PM 发表
Good

发表于 2007-6-9 15:00:42 | 显示全部楼层
原帖由 胶林探索 于 2007-6-9 14:52 发表

嘿,老手啊!
这个就是FPC的主要弱点。
要慢慢研究了。
主要的流行办法是生成一种中间语言,再对这个中间语言进行优化。


呵呵  要不尽量把变量分配在寄存器中 不够时再写回内存 只是这样就要跟踪变量的使用 比较复杂

生成中间语言的话 优化能力有限啊 听说gcc从4.0开始采用了个什么技术 从源语言一级进行优化 虽然现在的实际效果还不甚理想 但这应该是个方向
 楼主| 发表于 2007-6-9 15:04:39 | 显示全部楼层
原帖由 water 于 2007-6-9 03:00 PM 发表


呵呵  要不尽量把变量分配在寄存器中 不够时再写回内存 只是这样就要跟踪变量的使用 比较复杂

这个叫作着色图分配算法,FPC用了,但实现的不够好,只是一个很简单的分配,释放,spill
三个动作。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-8-21 13:22 , Processed in 0.196207 second(s), 18 queries .

快速回复 返回顶部 返回列表