File: CMP.md

package info (click to toggle)
intel-graphics-compiler 1.0.12504.6-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 83,912 kB
  • sloc: cpp: 910,147; lisp: 202,655; ansic: 15,197; python: 4,025; yacc: 2,241; lex: 1,570; pascal: 244; sh: 104; makefile: 25
file content (119 lines) | stat: -rw-r--r-- 3,529 bytes parent folder | download
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
<!---======================= begin_copyright_notice ============================

Copyright (C) 2020-2021 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; < 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
- **Source Modifier:** arithmetic 


## Text
```
    

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

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



## Notes



    - **Supported Type:** Source: HF, F, DF, B, UB, W, UW, D, UD, Q, UQ.	Destination (if general): 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.