Skip to content

Add FMUL, FMULS, and FMULSU #16

@Flu

Description

@Flu

FMUL – Fractional Multiply Unsigned

!! This is not an easy task, not recommended for beginners

This task is not a priority but it would be nice to have. I am as of yet not sure if these instructions even work on the Arduino Uno

Description

This instruction performs 8-bit × 8-bit → 16-bit unsigned multiplication and shifts the result one bit left.

Let (N.Q) denote a fractional number with N binary digits left of the radix point, and Q binary digits right of the
radix point. A multiplication between two numbers in the formats (N1.Q1) and (N2.Q2) results in the format ((N1+N2).
(Q1+Q2)). For signal processing applications, the format (1.7) is widely used for the inputs, resulting in a (2.14)
format for the product. A left shift is required for the high byte of the product to be in the same format as the inputs.
The FMUL instruction incorporates the shift operation in the same number of cycles as MUL.
The (1.7) format is most commonly used with signed numbers, while FMUL performs an unsigned multiplication. This
instruction is, therefore, most useful for calculating one of the partial products when performing a signed multiplication
with 16-bit inputs in the (1.15) format, yielding a result in the (1.31) format.
Note:  The result of the FMUL operation may suffer from a 2’s complement overflow if interpreted as a number in the
(1.15) format. The MSB of the multiplication before shifting must be taken into account and is found in the carry bit.
See the following example.
The multiplicand Rd and the multiplier Rr are two registers containing unsigned fractional numbers where the implicit
radix point lies between bit 6 and bit 7. The 16-bit unsigned fractional product with the implicit radix point between bit
14 and bit 15 is placed in R1 (high byte) and R0 (low byte).

FMULS, FMULSU

Also implement these two, as they're related.

Testing

Make assembly file tests for all of these. You can in theory just copy the examples from the documentation and make test cases for it in tests/MainTests.hs.

More information here

https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf#page=76

Metadata

Metadata

Assignees

No one assigned

    Labels

    emulator internalMods on the internal emulator API or functionalityenhancementNew feature or requestnot a priorityEnhancements or bugs that do need to be resolved but are not a priorityparserConcerning the parser/fron-end

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions