M68k-elf-gcc浮点问题

时间:2019-02-21 16:18:11

标签: gcc 68000 embedded-control

我正在尝试为68000处理器构建温度控制应用程序。我目前正在使用GCC 8.2.0。我正在使用-msoft-float标志进行编译。但是,浮点库例程似乎已损坏。示例:

exampleForm: FormGroup;
checked: boolean;

ngOnInit() {
  this.exampleForm = new FormGroup({
    'second': new FormControl('', [this.validateIfChecked()]),
    'first': new FormControl('example', [Validators.required])
  });
}


validateIfChecked(): ValidatorFn {
  return (control: AbstractControl): {
    [key: string]: any
  } | null => {
    if (this.checked) {
      return control.value ? null : {
        'err': true
      };
    }
    return null;
  }
}

有人可以解释为什么生成此代码或此处发生了什么吗? 68000不会跳转到奇数地址。

更新 我一直在研究这个问题,并且似乎在链接期间注入了问题。从libgcc.a转储此函数的代码将显示以下内容:

'000174f4 <__ltdf2>:'
   '174f4:  4e56 0000       linkw %fp,#0'
   '174f8:  4878 0001       pea 1 <ADD>'
   '174fc:  2f2e 0014       movel %fp@(20),%sp@-'
   '17500:  2f2e 0010       movel %fp@(16),%sp@-'
   '17504:  2f2e 000c       movel %fp@(12),%sp@-'
   '17508:  2f2e 0008       movel %fp@(8),%sp@-'
   '1750c:  61ff            bsrs 1750d <__ltdf2+0x19>'
   '1750e:  ffff            .short 0xffff'
   '17510:  fd94            .short 0xfd94'
   '17512:  4e5e            unlk %fp'
   '17514:  4e75            rts'
   '17516:  4e71            nop'

因此,链接器必须尝试填写分支偏移并弄乱。由于此功能的来源是一串宏,因此我不确定它真正想跳转到的位置。

1 个答案:

答案 0 :(得分:4)

在MC68020和更高版本上,如果8位位移为0xff,则brabsrbcc之后是32位位移。在您的情况下,这没有意义,因为0xfffffd94可以容纳16位。

如果没有68020或更高版本,请确保为68000编译(并且已编译softfloat-library)。