NXP MCU 技术论坛
直播中

李华瑞

8年用户 1019经验值
私信 关注
[问答]

如何将cosmic编译器的代码转换为CW 11.1?

我正在努力从 cosmic compiler 转换 CW 11.1 的源代码。
有些代码是通过汇编编写的,所以我不确定如何转换为 CW 11.1 的代码。

您能帮我一些忙吗?

1. leadingBits = (uint16_t)(int16_t)_asm(“clb d2, d2n”);
我尝试按如下方式更改代码。我不确定这是正确的。
#define 查找领先位16(val, num){asmLD D6,val;asmCLB D6、D0;asmLD D1,#14; asm子 D1、D0;asmST D1, 编号;
查找领先位16(输入, leadingSignBits);

2. tempValue =RBIT(十)RBIT(y);
结果 =bitsr(temp值);

回帖(1)

djelje

2025-3-24 18:13:58

将代码从Cosmic编译器迁移到CodeWarrior 11.1时,需要注意内联汇编语法和指令集的差异。以下是针对您提到的两个问题的解决方案:




1. 替换 clb 指令


原始代码


leadingBits = (uint16_t)(int16_t)_asm("clb d2, d2n");

问题分析



  • clb 指令在Cosmic中用于计算符号位连续相同的位数(Count Leading Bits)。

  • CodeWarrior的ColdFire/C68K编译器可能不支持直接等效指令,需用其他方法模拟。


解决方案
使用位操作和内置函数实现:


uint16_t leadingBits = 0;
if (input != 0) {
    leadingBits = (uint16_t)(14 - __builtin_clz((int16_t)input));
} else {
    leadingBits = 15; // 全零时的特殊处理
}

或通过内联汇编模拟:


asm volatile (
    "CLR.L D0nt"          // 清空D0
    "MOVE.W %1, D0nt"     // 输入值存入D0
    "BPL 1fnt"            // 检查符号位
    "NOT.L D0nt"          // 负数取反
    "1:nt"
    "FF1.L D0nt"          // 寻找第一个1的位置
    "SUBQ.W #1, D0nt"     // 调整结果
    "MOVE.W D0, %0"         // 输出到变量
    : "=m" (leadingBits)    // 输出操作数
    : "m" (input)           // 输入操作数
    : "d0"                  // 影响的寄存器
);



2. 替换 RBITbitsr


原始代码


tempValue = RBIT(x) RBIT(y);
result = bitsr(tempValue);

问题分析



  • RBIT 可能用于位反转,bitsr 可能为带符号右移。

  • CodeWarrior需使用内置函数或自定义实现。


解决方案



  • 位反转:使用内置函数 __REV 或自定义宏。

  • 右移操作:用标准位移运算符处理。


// 自定义32位反转(若架构不支持REV)
#define RBIT(val)
    (__builtin_bitreverse16(val) << 16 | __builtin_bitreverse16(val >> 16))

uint32_t tempValue = RBIT(x) | (RBIT(y) << 16);
int16_t result = (tempValue >> 1); // 带符号右移可能需要符号扩展

或内联汇编实现:


asm volatile (
    "MOVE.L %1, D0nt"
    "BYTEREV.L D0nt"      // 反转字节序(类似RBIT)
    "ASR.L #1, D0nt"      // 算术右移1位
    "MOVE.L D0, %0"
    : "=m" (result)
    : "m" (tempValue)
    : "d0"
);



关键注意事项



  1. 寄存器冲突:在内联汇编中明确声明使用的寄存器(如: "d0", "d1")。

  2. 语法差异:CodeWarrior使用asm volatile而非_asm

  3. 指令支持:确认目标处理器是否支持FF1BYTEREV等指令。

  4. 测试验证:通过单元测试确保结果与原始代码一致。


建议查阅CodeWarrior的《C/C++编译器内联汇编指南》和《指令集手册》,针对具体芯片型号调整实现。对于复杂汇编逻辑,可封装为独立模块逐步替换。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分