CP is a SS2 instruction which is used to compare packed decimal fields.  This instruction sets the condition code to “equal” (condition code = 0), “low” (condition code = 1) or “high” (condition code = 2) based on a comparison of the two fields as decimal numbers, and indicates how the first operand compares to the second operand.  The fields may be of equal or different sizes.  The only restrictions on the field lengths is that they must be a maximum of 16 bytes in length (the typical restriction for SS2 fields).  Consider the fields and instructions below.

APK      DC     P’123’ = X’123C’

BPK      DC     PL3’100’ = X’00100C

CHX      DC     X’123F’

...

CP     APK,BPK     C.C.= HIGH

CP     APK,CHX     C.C.= EQUAL

CLC    APK,CHX     C.C.= LOW

In the first CP, the fields are compared arithmetically and it is found that +123 is greater than +100.  In the second compare,  the condition code is set to “equal”  since  +123 is equal to +123 (x’F’ is a valid plus sign).  The third compare is a logical compare rather than an arithmetic compare.  Since x’3C’ is lower than x’3F’ in the EBCDIC collating sequence, the condition code is set to “low”.

After setting the condition code with a CP, the condition code can be tested with a branch instruction.  The typical branch instructions you might use are BE or BNE, BL or BNL, and BH or BNH.

Some unrelated CP’s:

QPK      DC      P’12345’      = X’12345C’

RPK      DC      P’-32’        = X’032D’

SZONED   DC      Z’11’         = X’F1C1’

...

Results:

CP    QPK,=P’20’   C.C. = HIGH

CP    RPK,=P’20’   C.C. = LOW

CP    SZONED,=P’999’  ABEND - SZONED IS NOT PACKED

CP    QPK,QPK      C.C. = EQUAL

CP    QPK,RPK      C.C. = HIGH

CP    RPK,QPK      C.C. = LOW

CP    QPK,=X’324A’ C.C. = HIGH  - LITERAL IS VALID PACKED DATA

CP    QPK+2(1),RPK   BAD IDEA, BUT IT DOES WORK C.C. = HIGH,