[llvm-dev] multiply-accumulate instruction

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 18 07:46:05 PDT 2015


----- Original Message -----

> From: "Chris.Dewhurst via llvm-dev" <llvm-dev at lists.llvm.org>
> To: llvm-dev at lists.llvm.org
> Sent: Friday, September 18, 2015 9:19:48 AM
> Subject: [llvm-dev] multiply-accumulate instruction

> I’m trying to define a multiply-accumulate instruction for the LEON
> processor, a Subtarget of the Sparc target.

> The documentation for the processor is as follows:

> ===
> To accelerate DSP algorithms, two multiply&accumulate instructions
> are implemented: UMAC and SMAC. The UMAC performs an unsigned 16-bit
> multiply, producing a 32-bit result, and adds the result to a 40-bit
> accumulator made up by the 8 lsb bits from the %y register and the
> %asr18 register. The least significant 32 bits are also written to
> the destination register. SMAC works similarly but performs signed
> multiply and accumulate. The MAC instructions execute in one clock
> but have two clocks latency, meaning that one pipeline stall cycle
> will be inserted if the following instruction uses the destination
> register of the MAC as a source operand.

> Assembler syntax:
> smac rs1, reg_imm, rd

> Operation:
> prod[31:0] = rs1[15:0] * reg_imm[15:0]
> result[39:0] = (Y[7:0] & %asr18[31:0]) + prod[31:0]
> (Y[7:0] & %asr18[31:0]) = result[39:0]
> rd = result[31:0]

> %asr18 can be read and written using the rdasr and wrasr
> instructions.
> ===

> I have the following in SparcInstrInfo to define the lowering rules
> for this instruction, but I feel that this isn’t likely to work as I
> need to somehow tie together the fact that %Y, %ASR18 and %rd are
> all related to each other in the output.

> let Predicates = [HasLeon3, HasLeon4], Defs = [Y, ASR18], Uses = [Y,
> ASR18] in
> def SMACrr : F3_1<3, 0b111110,
> (outs IntRegs:$rd), (ins IntRegs:$rs1, IntRegs:$rs2, ASRRegs:$asr18),
> "smac $rs1, $rs2, $rd",
> [(set i32:$rd,
> (add i32:$asr18, (mul i32:$rs1, i32:$rs2)))] >;

> Perhaps a well-chosen “let Constraints=” might be used here? If so,
> I’m not sure I know what to put in there. If not, can anyone help me
> how I might define the lowering rules for this instruction please?
You don't need to encode that relationship if the values placed in Y and ASR18 will be ignored. If you want to use those results, I suspect that you'll need to manually select the instruction in *ISelDAGToDAG.cpp, grabbing the result from the fixed registers by generating a glued CopyFromReg node. 

-Hal 

> Chris Dewhurst, University of Limerick.
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 

Hal Finkel 
Assistant Computational Scientist 
Leadership Computing Facility 
Argonne National Laboratory 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150918/2b4d6a02/attachment.html>


More information about the llvm-dev mailing list