[LLVMdev] Add/sub with carry; widening multiply
Duncan Sands
baldrick at free.fr
Wed Nov 21 13:03:01 PST 2007
On Wednesday 21 November 2007 20:31:04 Jonathan Brandmeyer wrote:
> I've been playing around with llvm lately and I was wondering something about the bitcode instructions for basic arithmetic. Is there any plan to provide instructions that perform widening multiply, or add with carry? It might be written as:
>
> mulw i32 %lhs %rhs -> i64 ; widening multiply
> addw i32 %lhs %rhs -> i33 ; widening add
> addc i32 %lhs, i32 %rhs, i1 %c -> i33 ; add with carry
>
> Alternatively, would something like following get reduced to a single multiply and two stores on arch's that support wide multiplies, like x86-32 and ARM?
>
> define void @mulw(i32* hidest, i32* lodest, i32 lhs, i32 rhs) {
> %0 = sext i32 %lhs to i64
> %1 = sext i32 %rhs to i64
> %2 = mul i64 %0 %1
> %3 = trunc i64 %2 to i32
> %4 = lshr i64 %2, 32
> %5 = truc i64 %4 to i32
> store i32 %3, i32* %lodest
> store i32 %5, i32* %hidest
> ret void
> }
>
> Another alternative could rely on multiple return values to return both the low and high words and/or carry bit separately.
> %0, %1 = subc i32 %lhs, i32 %rhs, i1 %borrow -> i32, i1 ; subtract including borrow, returning result and borrow flag
> %0, %1 = adc i32 %lhs, i32 %rhs, i1 %carry -> i32, i1 ; add with carry, returning result and carry
>
> Has anything like this been considered in the past?
This kind of thing is done by the code generators.
Ciao,
Duncan.
More information about the llvm-dev
mailing list