File: CMP.md

package info (click to toggle)
intel-graphics-compiler 1.0.17791.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 102,312 kB
  • sloc: cpp: 935,343; lisp: 286,143; ansic: 16,196; python: 3,279; yacc: 2,487; lex: 1,642; pascal: 300; sh: 174; makefile: 27
file content (156 lines) | stat: -rw-r--r-- 4,098 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!---======================= begin_copyright_notice ============================

Copyright (C) 2020-2022 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ==========================-->

## Opcode

  CMP = 0x2c

## Format

| | | | | | |
| --- | --- | --- | --- | --- | --- |
| 0x2c(CMP) | Exec_size | Rel_op | Dst | Src0 | Src1 |


## Semantics


```

                    for (i = 0; i < exec_size; ++i) {
                      if (ChEn[i]) {
                        if (dst is predicate) {
                          dst[i] = src0[i] rel_op src[i];
                        }
                        else { // dst is general operand
                          dst[i] = src0[i] rel_op src[i] ? -1 : 0;
                        }
                    }
```

## Description





```
    Performs component-wise comparison of <src0> and <src1> according to the relational operator and stores the results into <dst>.
```


- **Exec_size(ub):** Execution size

  - Bit[2..0]: size of the region for source and destination operands

    - 0b000:  1 element (scalar)
    - 0b001:  2 elements
    - 0b010:  4 elements
    - 0b011:  8 elements
    - 0b100:  16 elements
    - 0b101:  32 elements
  - Bit[7..4]: execution mask (explicit control over the enabled channels)

    - 0b0000:  M1
    - 0b0001:  M2
    - 0b0010:  M3
    - 0b0011:  M4
    - 0b0100:  M5
    - 0b0101:  M6
    - 0b0110:  M7
    - 0b0111:  M8
    - 0b1000:  M1_NM
    - 0b1001:  M2_NM
    - 0b1010:  M3_NM
    - 0b1011:  M4_NM
    - 0b1100:  M5_NM
    - 0b1101:  M6_NM
    - 0b1110:  M7_NM
    - 0b1111:  M8_NM

- **Rel_op(ub):** Relational operator for the comparison

  - Bit[2..0]: encode the relational operator

    - 0b000:  EQ - equal to
    - 0b001:  NE - not equal
    - 0b010:  GT - greater than
    - 0b011:  GE - greater than or equal to
    - 0b100:  LT - less than
    - 0b101:  LE - less than or equal to

- **Dst(vec_operand):** The destination operand. Operand class: predicate,general


- **Src0(vec_operand):** The first source operand. Operand class: general,indirect,immediate


- **Src1(vec_operand):** The second source operand. Operand class: general,indirect,immediate


#### Properties
- **Supported Types:** B,D,DF,F,HF,Q,UB,UD,UQ,UW,W.{XEHP+}BF
- **Source Modifier:** arithmetic


#### Operand type maps
- **Type map**
  -  **Dst types:** UD, D, UW, W, UB, B
  -  **Src types:** UD, D, UW, W, UB, B
- **Type map**
  -  **Dst types:** F
  -  **Src types:** UD, D, UW, W, UB, B
- **Type map**
  -  **Dst types:** F, HF
  -  **Src types:** F, HF
- **Type map{XEHP+}**
  -  **Dst types:** F, BF
  -  **Src types:** F, BF
- **Type map**
  -  **Dst types:** DF
  -  **Src types:** DF
- **Type map**
  -  **Dst types:** HF
  -  **Src types:** UD, D, UW, W, UB, B


## Text
```



    CMP.rel_op  (<exec_size>) <dst> <src0> <src1>

    //rel_op is one of "eq", "ne", "gt", "ge", "lt", "le"
```
## Notes





```
    Supported Types:
        - Source: BF, HF, F, DF, B, UB, W, UW, D, UD, Q, UQ.
        - Destination (if general): BF, HF, F, DF, B, UB, UW, D, UD, Q, UQ.

    Predication is not allowed for this instruction.If destination is a general operand:
        - Either all ones (0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFF based on type size) or all zeros will be assigned to it based on the comparison results.
        - If both sources have float type, destintation must have the same type as source

    CMP and SETP instructions are the only way to create a new predicate value. Floating point comparison for special values follows the rules below:
        - Less than. src0 < src1 and neither source is NaN.
        - Equal. src0 = src1 and neither source is NaN.
        - Greater than. src0 > src1 and neither source is NaN.
        - Unordered. Any source is NaN.

    Any NaN compares unordered to any value, including itself. Specifically, if one of the operands is NaN, NE comparison returns true while all other comparisons return false.
    Infinities of the same sign compare as equal.
    Zeros compare as equal regardless of sign: -0 = +0.
```