mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 03:42:17 +00:00
another go at umul
This commit is contained in:
parent
2a302cfc46
commit
d7f392bbea
3 changed files with 38 additions and 25 deletions
|
@ -443,12 +443,16 @@ impl Assembler<AArch64GeneralReg, AArch64FloatReg> for AArch64Assembler {
|
||||||
todo!("register signed multiplication for AArch64");
|
todo!("register signed multiplication for AArch64");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn umul_reg64_reg64_reg64(
|
fn umul_reg64_reg64_reg64<'a, ASM, CC>(
|
||||||
_buf: &mut Vec<'_, u8>,
|
_buf: &mut Vec<'a, u8>,
|
||||||
|
_storage_manager: &mut StorageManager<'a, AArch64GeneralReg, AArch64FloatReg, ASM, CC>,
|
||||||
_dst: AArch64GeneralReg,
|
_dst: AArch64GeneralReg,
|
||||||
_src1: AArch64GeneralReg,
|
_src1: AArch64GeneralReg,
|
||||||
_src2: AArch64GeneralReg,
|
_src2: AArch64GeneralReg,
|
||||||
) {
|
) where
|
||||||
|
ASM: Assembler<AArch64GeneralReg, AArch64FloatReg>,
|
||||||
|
CC: CallConv<AArch64GeneralReg, AArch64FloatReg, ASM>,
|
||||||
|
{
|
||||||
todo!("register unsigned multiplication for AArch64");
|
todo!("register unsigned multiplication for AArch64");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -228,12 +228,15 @@ pub trait Assembler<GeneralReg: RegTrait, FloatReg: RegTrait>: Sized + Copy {
|
||||||
src1: GeneralReg,
|
src1: GeneralReg,
|
||||||
src2: GeneralReg,
|
src2: GeneralReg,
|
||||||
);
|
);
|
||||||
fn umul_reg64_reg64_reg64(
|
fn umul_reg64_reg64_reg64<'a, ASM, CC>(
|
||||||
buf: &mut Vec<'_, u8>,
|
buf: &mut Vec<'a, u8>,
|
||||||
|
storage_manager: &mut StorageManager<'a, GeneralReg, FloatReg, ASM, CC>,
|
||||||
dst: GeneralReg,
|
dst: GeneralReg,
|
||||||
src1: GeneralReg,
|
src1: GeneralReg,
|
||||||
src2: GeneralReg,
|
src2: GeneralReg,
|
||||||
);
|
) where
|
||||||
|
ASM: Assembler<GeneralReg, FloatReg>,
|
||||||
|
CC: CallConv<GeneralReg, FloatReg, ASM>;
|
||||||
|
|
||||||
fn sub_reg64_reg64_imm32(buf: &mut Vec<'_, u8>, dst: GeneralReg, src1: GeneralReg, imm32: i32);
|
fn sub_reg64_reg64_imm32(buf: &mut Vec<'_, u8>, dst: GeneralReg, src1: GeneralReg, imm32: i32);
|
||||||
fn sub_reg64_reg64_reg64(
|
fn sub_reg64_reg64_reg64(
|
||||||
|
@ -773,24 +776,21 @@ impl<
|
||||||
Layout::Builtin(Builtin::Int(
|
Layout::Builtin(Builtin::Int(
|
||||||
IntWidth::U64 | IntWidth::U32 | IntWidth::U16 | IntWidth::U8,
|
IntWidth::U64 | IntWidth::U32 | IntWidth::U16 | IntWidth::U8,
|
||||||
)) => {
|
)) => {
|
||||||
// TODO find a general way to do this
|
|
||||||
let rax = CC::GENERAL_RETURN_REGS[0];
|
|
||||||
let rdx = CC::GENERAL_RETURN_REGS[1];
|
|
||||||
|
|
||||||
self.storage_manager
|
|
||||||
.ensure_reg_free(&mut self.buf, RegStorage::General(rax));
|
|
||||||
|
|
||||||
self.storage_manager
|
|
||||||
.ensure_reg_free(&mut self.buf, RegStorage::General(rdx));
|
|
||||||
|
|
||||||
self.storage_manager
|
|
||||||
.load_to_specified_general_reg(&mut self.buf, src1, rax);
|
|
||||||
|
|
||||||
let dst_reg = self.storage_manager.claim_general_reg(&mut self.buf, dst);
|
let dst_reg = self.storage_manager.claim_general_reg(&mut self.buf, dst);
|
||||||
|
let src1_reg = self
|
||||||
|
.storage_manager
|
||||||
|
.load_to_general_reg(&mut self.buf, src1);
|
||||||
let src2_reg = self
|
let src2_reg = self
|
||||||
.storage_manager
|
.storage_manager
|
||||||
.load_to_general_reg(&mut self.buf, src2);
|
.load_to_general_reg(&mut self.buf, src2);
|
||||||
ASM::umul_reg64_reg64_reg64(&mut self.buf, dst_reg, rax, src2_reg);
|
|
||||||
|
ASM::umul_reg64_reg64_reg64(
|
||||||
|
&mut self.buf,
|
||||||
|
&mut self.storage_manager,
|
||||||
|
dst_reg,
|
||||||
|
src1_reg,
|
||||||
|
src2_reg,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Layout::Builtin(Builtin::Float(FloatWidth::F64)) => {
|
Layout::Builtin(Builtin::Float(FloatWidth::F64)) => {
|
||||||
let dst_reg = self.storage_manager.claim_float_reg(&mut self.buf, dst);
|
let dst_reg = self.storage_manager.claim_float_reg(&mut self.buf, dst);
|
||||||
|
|
|
@ -1009,15 +1009,24 @@ impl Assembler<X86_64GeneralReg, X86_64FloatReg> for X86_64Assembler {
|
||||||
imul_reg64_reg64(buf, dst, src2);
|
imul_reg64_reg64(buf, dst, src2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
fn umul_reg64_reg64_reg64<'a, ASM, CC>(
|
||||||
fn umul_reg64_reg64_reg64(
|
buf: &mut Vec<'a, u8>,
|
||||||
buf: &mut Vec<'_, u8>,
|
storage_manager: &mut StorageManager<'a, X86_64GeneralReg, X86_64FloatReg, ASM, CC>,
|
||||||
dst: X86_64GeneralReg,
|
dst: X86_64GeneralReg,
|
||||||
src1: X86_64GeneralReg,
|
src1: X86_64GeneralReg,
|
||||||
src2: X86_64GeneralReg,
|
src2: X86_64GeneralReg,
|
||||||
) {
|
) where
|
||||||
mov_reg64_reg64(buf, dst, src1);
|
ASM: Assembler<X86_64GeneralReg, X86_64FloatReg>,
|
||||||
|
CC: CallConv<X86_64GeneralReg, X86_64FloatReg, ASM>,
|
||||||
|
{
|
||||||
|
use crate::generic64::RegStorage;
|
||||||
|
|
||||||
|
storage_manager.ensure_reg_free(buf, RegStorage::General(X86_64GeneralReg::RAX));
|
||||||
|
storage_manager.ensure_reg_free(buf, RegStorage::General(X86_64GeneralReg::RDX));
|
||||||
|
|
||||||
|
mov_reg64_reg64(buf, X86_64GeneralReg::RAX, src1);
|
||||||
mul_reg64_reg64(buf, src2);
|
mul_reg64_reg64(buf, src2);
|
||||||
|
mov_reg64_reg64(buf, dst, X86_64GeneralReg::RAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mul_freg32_freg32_freg32(
|
fn mul_freg32_freg32_freg32(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue