gpt4 book ai didi

c - 16bit*32bit MUL 结果为48bit

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:10 25 4
gpt4 key购买 nike

我想做 16bit * 32bit Mul 运算但只使用 32bit 寄存器。由于输出是 48 位,结果可以被两个 32 位寄存器捕获。我想要这个问题的 C 代码!我有 32 位 * 32 位 MUL 和 64 位输出功能,但由于有迹象,我无法在这里正确使用此功能。例如 16 位减一是 0xFFFF,32 位减一是 0xFFFFFFFF。我将使用此代码进行 MUL 的 LLVM 翻译。

最佳答案

你想做这样的事情吗?

#include <inttypes.h>

void multiply(uint16_t*top,uint32_t*bottom, uint16_t lhs,uint32_t rhs){

uint32_t low=lhs*(rhs&0xFFFF);
uint32_t high=lhs*(rhs>>16)+(low>>16);
*bottom=(high)<<16)|(low&0xFFFF);
*top=(high>>16);
}

当您意识到您是将一位数字乘以两位数且都以 65536 (2**16) 为底数时,事情就简单多了。

我只使用 64 位来检查和显示输出。乘法在 32 位中运行。

这是在测试工具中:

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

void multiply(uint16_t*top,uint32_t*bottom, uint16_t lhs,uint32_t rhs){

uint32_t low=lhs*(rhs&0xFFFF);
uint32_t high=lhs*(rhs>>16)+(low>>16);
*bottom=(high)<<16)|(low&0xFFFF);
*top=(high>>16);
}

uint64_t encode64(uint16_t top,uint32_t bottom){
return (((uint64_t)top)<<32)|((uint64_t)bottom);
}

int check(uint16_t lhs,uint32_t rhs){
uint16_t t16;
uint32_t t32;

multiply(&t16,&t32,lhs,rhs);
const uint64_t result=encode64(t16,t32);

uint64_t llhs=lhs;
uint64_t lrhs=rhs;
uint64_t expect=llhs*lrhs;

if(result==expect){
return 0;
}
printf("%"PRIu16"*%"PRIu32"==%"PRIu64"!=%"PRIu64"\n",lhs,rhs,result,expect);
return 1;
}

int main(void) {
int error=0;
uint16_t top;
uint32_t bottom;
uint16_t lhs=58989;
uint32_t rhs=5978342;
error+=check(2U,20UL);
error+=check(0xFFFF,0xFFFFFFFF);
error+=check(768U,565354767UL);
error+=check(26434U,566534767UL);
error+=check(26434U,690789UL);
error+=check(5678U,9767889UL);
error+=check(3674U,784367UL);
error+=check(0,690789ULL);
error+=check(0,0xFFFFFFFF);
error+=check(0xFFFF,0);
error+=check(0xFFFF,1);
error+=check(1,0xFFFFFFFF);
error+=check(0x2,0xAFFFFFFF);
multiply(&top,&bottom,lhs,rhs);

uint64_t result=encode64(top,bottom);

printf("%"PRIu16"*%"PRIu32"==%"PRIu64"\n",lhs,rhs,result);

if(error!=0){
printf("\nErrors=%d\n",error);
}

return error==0?EXIT_SUCCESS:EXIT_FAILURE;
}

关于c - 16bit*32bit MUL 结果为48bit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28045973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com