MP is a SS2 instruction which is used to multiply packed decimal fields.  Operand 1 is a field in storage which initially contains a packed decimal number representing the multiplicand.  The product develops in this field, destroying the multiplicand.  The contents of Operand 2, another packed decimal field in storage, represents the multiplier.  This field is unchanged by the multiplication (unless it also participates as operand 1).  The condition code is not set by this instruction.

 

   There are three rules that must be followed concerning the lengths of the fields that participate in a multiply packed instruction.

 

   1)  The multiplier is limited to a maximum of 8 bytes.

 

   2)  The multiplicand field can be as large as 16 bytes.

 

   3)  If the length of operand 2 is “L2”, then the multiplicand must contain at least L2 bytes of leading zeroes before the instruction is executed.

 

 For example,

 

               APK      DC    PL4’12345’     = X’0012345C’

               BPK      DC    PL2’100’       = X’100C’

                        ...

                        MP    APK,BPK

 

The MP above causes an “0C6” abend because APK contains 1 byte of leading zeroes and BPK is 2 bytes long.  In order to multiply APK and BPK above, we must code a work area that is large enough to support a sufficient number of leading zeroes.  Adding the lengths of both fields we see that a field of length 6 is large enough to prevent this problem.

 

               WORK     DS    PL6

                        ...

                        ZAP   WORK,APK

                        MP    WORK,BPK

 

 

 

 

 

 

          Some unrelated MP’s:

 

 A        DC      P’25645’     = X’25645C’

 B        DC      P’11’        = X’011C’    

 C        DC      P’-4’        = X’4D’

 D        DC      P’9876543’   = X’9876543C’    4 BYTE FIELD

 WORK     DS      PL6

          ...

                              Results:

          ZAP   WORK,A      WORK = X’00000025645C’ 3 BYTES LEADING 0’S

          MP    WORK,=P’20’ WORK = X’00000512900C’ 

 

          ZAP   WORK,B      WORK = X’00000000011C’ 4 BYTES LEADING 0’S 

          MP    WORK,B      WORK = X’00000000121C’ 

 

          ZAP   WORK,A      WORK = X’00000025645C’ 3 BYTES LEADING 0’S

          MP    WORK,B      WORK = X’00000282095C’ 

 

          ZAP   WORK,A      WORK = X’00000025645C’ 3 BYTES LEADING 0’S

          MP    WORK,D      ABEND (0C6) - NOT ENOUGH LEADING 0’S

 

          MP    A,B         ABEND - NOT ENOUGH LEADING 0’S IN “A”

 

 

1. When creating a work field for a multiplication, the rule of thumb is to make the work area at least as large as the sum of the fields that contain the multiplicand and the multiplier.  There is no harm in overestimating the size of the work area, but an area that is too small will cause an abend.