File: BinaryEncoding.h

package info (click to toggle)
intel-graphics-compiler2 2.24.13-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 113,504 kB
  • sloc: cpp: 812,849; lisp: 288,219; ansic: 102,423; python: 4,010; yacc: 2,588; lex: 1,666; pascal: 318; sh: 162; makefile: 38
file content (762 lines) | stat: -rw-r--r-- 22,050 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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
/*========================== begin_copyright_notice ============================

Copyright (C) 2017-2023 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ===========================*/

#ifndef _BINARYENCODING_H_
#define _BINARYENCODING_H_

#include <fstream>
#include <string>

#include "Common_BinaryEncoding.h"
#include "FlowGraph.h"

///////////////////////////////////////////////////////////////////////////////
// Constants
///////////////////////////////////////////////////////////////////////////////

typedef enum _AccessMode_ {
  ACCESS_MODE_ALIGN1,
  ACCESS_MODE_ALIGN16
} AccessMode;

typedef enum _predicate_state_ {
  PREDICATE_STATE_NORMAL,
  PREDICATE_STATE_INVERT
} PredicateState;

typedef enum _predicate_ {
  PREDICATE_OFF,
  PREDICATE_ALIGN16_SEQUENTIAL,
  PREDICATE_ALIGN16_REP_X,
  PREDICATE_ALIGN16_REP_Y,
  PREDICATE_ALIGN16_REP_Z,
  PREDICATE_ALIGN16_REP_W,
  PREDICATE_ALIGN16_ANY4H,
  PREDICATE_ALIGN16_ALL4H,

  PREDICATE_ALIGN1_SEQUENTIAL = 1,
  PREDICATE_ALIGN1_ANYV,
  PREDICATE_ALIGN1_ALLV,
  PREDICATE_ALIGN1_ANY2H,
  PREDICATE_ALIGN1_ALL2H,
  PREDICATE_ALIGN1_ANY4H,
  PREDICATE_ALIGN1_ALL4H,
  PREDICATE_ALIGN1_ANY8H,
  PREDICATE_ALIGN1_ALL8H,
  PREDICATE_ALIGN1_ANY16H,
  PREDICATE_ALIGN1_ALL16H,
  // valid for Gen7 only
  PREDICATE_ALIGN1_ANY32H,
  PREDICATE_ALIGN1_ALL32H
} Predicate;

typedef enum _ConditionCodes_ {
  COND_CODE_NONE,
  COND_CODE_Z,
  COND_CODE_NZ,
  COND_CODE_G,
  COND_CODE_GE,
  COND_CODE_L,
  COND_CODE_LE,
  COND_CODE_C,
  COND_CODE_O,
  COND_CODE_ANY,
  COND_CODE_ALL
} ConditionCodes;

typedef enum _QtrCtrl_ {
  QTR_CTRL_1Q,
  QTR_CTRL_2Q,
  QTR_CTRL_3Q,
  QTR_CTRL_4Q
} QtrCtrl;

typedef enum _ComprCtrl_ { COMPR_CTRL_NORMAL, COMPR_CTRL_COMPRESSED } ComprCtrl;

// GT
typedef enum _CmptCtrl_ { CMPT_CTRL_NORMAL, CMPT_CTRL_COMPACTED } CmptCtrl;

///////////////////////////////////////////////////////////////////////////////
// Gen7 specific fields
///////////////////////////////////////////////////////////////////////////////
typedef enum _ThreeSrcType_ {
  THREE_SRC_TYPE_F = 0,
  THREE_SRC_TYPE_D = 1,
  THREE_SRC_TYPE_UD = 2,
  THREE_SRC_TYPE_DF = 3,
  THREE_SRC_TYPE_HF = 4,
} ThreeSrcType;

typedef enum _NibCtrl_ { NIB_FALSE = 0, NIB_TRUE = 1 } NibCtrl;

///////////////////////////////////////////////////////////////////////////////
// End of Gen7 specific fields
///////////////////////////////////////////////////////////////////////////////
typedef enum _threadControl_ {
  THREAD_CTRL_NORMAL,
  THREAD_CTRL_ATOMIC,
  THREAD_CTRL_SWITCH
} ThreadCtrl;

typedef enum _CInstModifier_ { INST_MOD_NONE, INST_MOD_SAT } InstModifier;

typedef enum _DepCtrl_ {
  DEP_CTRL_NORMAL,
  DEP_CTRL_DIS_CLEAR,
  DEP_CTRL_DIS_CHECK,
  DEP_CTRL_DIS_CHECK_CLEAR_DEST
} DepCtrl;

typedef enum _SrcMod_ {
  SRC_MOD_NONE,
  SRC_MOD_ABSOLUTE,
  SRC_MOD_NEGATE,
  SRC_MOD_NEGATE_OF_ABSOLUTE
} SrcMod;

typedef enum _SrcType_ {
  SRC_TYPE_UD,
  SRC_TYPE_D,
  SRC_TYPE_UW,
  SRC_TYPE_W,
  SRC_TYPE_UB,
  SRC_TYPE_B,
  SRC_TYPE_DF,
  SRC_TYPE_F,
  SRC_TYPE_UQ = 8,
  SRC_TYPE_Q = 9,
  SRC_TYPE_HF = 10,
  SRC_TYPE_UNDEF = 0xFFFFFFFF
} SrcType;

typedef enum _SrcImmType_ {
  SRC_IMM_TYPE_UD,
  SRC_IMM_TYPE_D,
  SRC_IMM_TYPE_UW,
  SRC_IMM_TYPE_W,
  SRC_IMM_TYPE_UV,
  SRC_IMM_TYPE_VF,
  SRC_IMM_TYPE_V,
  SRC_IMM_TYPE_F,
  SRC_IMM_TYPE_UQ = 8,
  SRC_IMM_TYPE_Q = 9,
  SRC_IMM_TYPE_DF = 10,
  SRC_IMM_TYPE_HF = 11,
  SRC_IMM_TYPE_UNDEF = 0xFFFFFFFF
} SrcImmType;

const int aSrcImmType[] = {
    // byte counts
    4, // UD
    4, // D
    2, // UW
    2, // W
    4, // UV
    4, // VF
    4, // V
    4  // F
};

typedef enum _DstType_ {
  DST_TYPE_UD,
  DST_TYPE_D,
  DST_TYPE_UW,
  DST_TYPE_W,
  DST_TYPE_UB,
  DST_TYPE_B,
  DST_TYPE_DF,
  DST_TYPE_F = 7,
  DST_TYPE_UQ = 8,
  DST_TYPE_Q = 9,
  DST_TYPE_HF = 10, // for half float
  DST_TYPE_UNDEF = 0xFFFFFFFF
} DstType;

typedef enum _IdxType_ { IDX_TYPE_D, IDX_TYPE_W } IdxType;

typedef enum _VertStride_ {
  VERT_STRIDE_0,
  VERT_STRIDE_1,
  VERT_STRIDE_2,
  VERT_STRIDE_4,
  VERT_STRIDE_8,
  VERT_STRIDE_16,
  VERT_STRIDE_32,
  VERT_STRIDE_ONE_DIMEN = 15
} EncVertStride,
    *pEncVertStride;

typedef enum _Width_ {
  WIDTH_1,
  WIDTH_2,
  WIDTH_4,
  WIDTH_8,
  WIDTH_16
} EncWidth,
    *pEncWidth;

typedef enum _HorzStride_ {
  HORZ_STRIDE_0,
  HORZ_STRIDE_1,
  HORZ_STRIDE_2,
  HORZ_STRIDE_4
} EncHorzStride,
    *pEncHorzStride;

const uint32_t VERT_STRIDE_VxH = 0xFFFFFFFF;

///////////////////////////////////////////////////
//// 32 bit message descriptor in send instruction
///////////////////////////////////////////////////
// typedef struct _sEncMsgDescriptor_
//{
//     unsigned short  ResponseLength  : 4,
//                     MessageLength   : 4,
//                     TargetUnitId    : 6,
//                     Reserved        : 1,
//                     EndOfThread     : 1;
// } * psEncMsgDescriptor, sEncMsgDescriptor;

/////////////////////////////////////////////////
// 6 bit extended message descriptor in send instruction
/////////////////////////////////////////////////
typedef struct _sEncExtMsgDescriptor_ {
  uint32_t TargetUnitId : 4, Reserved : 1, EndOfThread : 1,
      ExtMessageLength : 4, Reserved2 : 1, CPSLODCompensation : 1,
      Reserved3 : 4, ExtFunctionControl : 16;
} *psEncExtMsgDescriptor, sEncExtMsgDescriptor;
//
// typedef union _EncMsgDescriptor_
//{
//    uint32_t        ulData;
//    sEncMsgDescriptor   MsgDescriptor;
//} * pEncMsgDescriptor, EncMsgDescriptor;

typedef union _EncExtMsgDescriptor_ {
  uint32_t ulData;
  sEncExtMsgDescriptor ExtMsgDescriptor;
} *pEncExtMsgDescriptor, EncExtMsgDescriptor;

////////////////////////////////////////////////
// 128 bit ISA instruction
// Version 0.75
////////////////////////////////////////////////

#define bitsPredicate_0 20
#define bitsPredicate_1 16
#define bitsThreadCtrl_0 15
#define bitsThreadCtrl_1 14
#define bitsQtrCtrl_0 13
#define bitsQtrCtrl_1 12
#define bitsComprCtrl_0 13
#define bitsComprCtrl_1 12

#define bitsCompactCtrl_0 29
#define bitsCompactCtrl_1 29

#define bitsAccessMode_0 8
#define bitsAccessMode_1 8
#define bitsOpCode_0 6
#define bitsOpCode_1 0
#define bitsInstModifier_0 31
#define bitsInstModifier_1 31
#define bitsExecSize_0 23
#define bitsExecSize_1 21

#define bitsDstAddrMode_0 63
#define bitsDstAddrMode_1 63
#define bitsDstHorzStride_0 62
#define bitsDstHorzStride_1 61
#define bitsDstRegNumOWord_0 60
#define bitsDstRegNumOWord_1 52
#define bitsDstRegNumByte_0 60
#define bitsDstRegNumByte_1 48
#define bitsDstChanEn_0 51
#define bitsDstChanEn_1 48

#define bitsDstArchRegFile_0 60
#define bitsDstArchRegFile_1 57
#define bitsDstArchRegNum_0 56
#define bitsDstArchRegNum_1 53
#define bitsDstArchSubRegNumOWord_0 52
#define bitsDstArchSubRegNumOWord_1 52
#define bitsDstArchSubRegNumWord_0 52
#define bitsDstArchSubRegNumWord_1 49
#define bitsDstArchSubRegNumByte_0 52
#define bitsDstArchSubRegNumByte_1 48
#define bitsDstImm16_0 63
#define bitsDstImm16_1 48

#define bitsSrcAddrMode_0 79
#define bitsSrcAddrMode_1 79
#define bitsSrcAddrMode_2 111
#define bitsSrcAddrMode_3 111
#define bitsSrcSrcMod_0 78
#define bitsSrcSrcMod_1 77
#define bitsSrcSrcMod_2 110
#define bitsSrcSrcMod_3 109
#define bitsSrcRegNumOWord_0 76
#define bitsSrcRegNumOWord_1 68
#define bitsSrcRegNumOWord_2 108
#define bitsSrcRegNumOWord_3 100
#define bitsSrcRegNumByte_0 76
#define bitsSrcRegNumByte_1 64
#define bitsSrcRegNumByte_2 108
#define bitsSrcRegNumByte_3 96
#define bitsSrcChanSel_0_0 65
#define bitsSrcChanSel_0_1 64
#define bitsSrcChanSel_0_2 97
#define bitsSrcChanSel_0_3 96
#define bitsSrcChanSel_1_0 67
#define bitsSrcChanSel_1_1 66
#define bitsSrcChanSel_1_2 99
#define bitsSrcChanSel_1_3 98
#define bitsSrcChanSel_2_0 81
#define bitsSrcChanSel_2_1 80
#define bitsSrcChanSel_2_2 113
#define bitsSrcChanSel_2_3 112
#define bitsSrcChanSel_3_0 83
#define bitsSrcChanSel_3_1 82
#define bitsSrcChanSel_3_2 115
#define bitsSrcChanSel_3_3 114
#define bitsSrcVertStride_0 88
#define bitsSrcVertStride_1 85
#define bitsSrcVertStride_2 120
#define bitsSrcVertStride_3 117
#define bitsSrcWidth_0 84
#define bitsSrcWidth_1 82
#define bitsSrcWidth_2 116
#define bitsSrcWidth_3 114
#define bitsSrcHorzStride_0 81
#define bitsSrcHorzStride_1 80
#define bitsSrcHorzStride_2 113
#define bitsSrcHorzStride_3 112

#define bitsSrcArchRegFile_0 76
#define bitsSrcArchRegFile_1 73
#define bitsSrcArchRegFile_2 108
#define bitsSrcArchRegFile_3 105
#define bitsSrcArchRegNum_0 72
#define bitsSrcArchRegNum_1 69
#define bitsSrcArchRegNum_2 104
#define bitsSrcArchRegNum_3 101
#define bitsSrcArchSubRegNumOWord_0 68
#define bitsSrcArchSubRegNumOWord_1 68
#define bitsSrcArchSubRegNumOWord_2 100
#define bitsSrcArchSubRegNumOWord_3 100
#define bitsSrcArchSubRegNumWord_0 68
#define bitsSrcArchSubRegNumWord_1 65
#define bitsSrcArchSubRegNumWord_2 100
#define bitsSrcArchSubRegNumWord_3 97
#define bitsSrcArchSubRegNumByte_0 68
#define bitsSrcArchSubRegNumByte_1 64
#define bitsSrcArchSubRegNumByte_2 100
#define bitsSrcArchSubRegNumByte_3 96

#define bitsSharedFunctionID_0 27
#define bitsSharedFunctionID_1 24

#define bitsExMsgLength_0 67
#define bitsExMsgLength_1 64
// CNL uses bit 31 to encode this flag.
#define bitsExDescCPSLOD_0 31
#define bitsExDescCPSLOD_1 31
// SKL+ extended message descriptor
#define bitsSendExDesc16 64
#define bitsSendExDesc19 67
#define bitsSendExDesc20 80
#define bitsSendExDesc23 83
#define bitsSendExDesc24 85
#define bitsSendExDesc27 88
#define bitsSendExDesc28 91
#define bitsSendExDesc31 94

#define bitsSendsExDescFuncCtrl_0 95
#define bitsSendsExDescFuncCtrl_1 80

#define bitsMsgDescriptor_0 127
#define bitsMsgDescriptor_1 96
#define bitsMsgDescriptorImm_0 126
#define bitsMsgDescriptorImm_1 96
#define bitsMsgDescriptorReg_0 120
#define bitsMsgDescriptorReg_1 96
#define bitsEndOfThread_0 127
#define bitsEndOfThread_1 127
#define bitsSendDesc_29 125
#define bitsSendDesc_30 126

#define bitsCpu_0 47
#define bitsCpu_1 47
#define bitsMathFunction_0 27
#define bitsMathFunction_1 24
#define bitsMathPartPrec_0 14
#define bitsMathPartPrec_1 14

#define bitsSrcImm64_0 127
#define bitsSrcImm64_1 96
#define bitsSrcImm64_2 95
#define bitsSrcImm64_3 64

// for SKL+ send instruction
#define bitsNoSrcDepSet_0 28
#define bitsNoSrcDepSet_1 28

////////////////////////////////////////////////
// 3 Source ISA instruction
// Version 0.0
////////////////////////////////////////////////

// DW0 [31:0] same as regular ISA
#define bits3SrcDstChanEn_0 52
#define bits3SrcDstChanEn_1 49
#define bits3SrcDstRegNumOWord_0 63
#define bits3SrcDstRegNumOWord_1 55
#define bits3SrcDstRegNumDWord_0 63
#define bits3SrcDstRegNumDWord_1 53

//                                                       src0      src1 src2
#define bits3SrcRepCtrl_0 64
#define bits3SrcRepCtrl_1 64
#define bits3SrcRepCtrl_2 85
#define bits3SrcRepCtrl_3 85
#define bits3SrcRepCtrl_4 106
#define bits3SrcRepCtrl_5 106

// Swizzle controls
#define bits3SrcSwizzle_0 72
#define bits3SrcSwizzle_1 65
#define bits3SrcSwizzle_2 93
#define bits3SrcSwizzle_3 86
#define bits3SrcSwizzle_4 114
#define bits3SrcSwizzle_5 107

#define bits3SrcChanSel_0_0 66
#define bits3SrcChanSel_0_1 65
#define bits3SrcChanSel_0_2 87
#define bits3SrcChanSel_0_3 86
#define bits3SrcChanSel_0_4 108
#define bits3SrcChanSel_0_5 107

#define bits3SrcChanSel_1_0 68
#define bits3SrcChanSel_1_1 67
#define bits3SrcChanSel_1_2 89
#define bits3SrcChanSel_1_3 88
#define bits3SrcChanSel_1_4 110
#define bits3SrcChanSel_1_5 109

#define bits3SrcChanSel_2_0 70
#define bits3SrcChanSel_2_1 69
#define bits3SrcChanSel_2_2 91
#define bits3SrcChanSel_2_3 90
#define bits3SrcChanSel_2_4 112
#define bits3SrcChanSel_2_5 111

#define bits3SrcChanSel_3_0 72
#define bits3SrcChanSel_3_1 71
#define bits3SrcChanSel_3_2 93
#define bits3SrcChanSel_3_3 92
#define bits3SrcChanSel_3_4 114
#define bits3SrcChanSel_3_5 113

#define bits3SrcSrcRegNumHWord_4 125
#define bits3SrcSrcRegNumHWord_5 118

#define bits3SrcSrcRegNumOWord_0 83
#define bits3SrcSrcRegNumOWord_1 75
#define bits3SrcSrcRegNumOWord_2 104
#define bits3SrcSrcRegNumOWord_3 96
#define bits3SrcSrcRegNumOWord_4 125
#define bits3SrcSrcRegNumOWord_5 117

// Get/Setbits cannot cross 32 bit boundary
#define bits3SrcSrcRegNumDWord_0 83
#define bits3SrcSrcRegNumDWord_1 73
#define bits3SrcSrcRegNumDWord_2 104
#define bits3SrcSrcRegNumDWord_3 96
#define bits3SrcSrcRegNumDWord_4 125
#define bits3SrcSrcRegNumDWord_5 115
#define bits3SrcSrcRegNumDWord_6 95
#define bits3SrcSrcRegNumDWord_7 94

#define bits3SrcSrc0RegDWord_L 73
#define bits3SrcSrc0RegDWord_H 83
#define bits3SrcSrc1RegDWord1_L 96
#define bits3SrcSrc1RegDWord1_H 104
#define bits3SrcSrc1RegDWord2_L 94
#define bits3SrcSrc1RegDWord2_H 95
#define bits3SrcSrc2RegDWord_L 115
#define bits3SrcSrc2RegDWord_H 125

#define bits3SrcSrc0SubRegNumW_L 84
#define bits3SrcSrc0SubRegNumW_H 84
#define bits3SrcSrc1SubRegNumW_L 105
#define bits3SrcSrc1SubRegNumW_H 105
#define bits3SrcSrc2SubRegNumW_L 126
#define bits3SrcSrc2SubRegNumW_H 126

// various bits for split send
#define bitsSendsSrc1RegFile_0 36
#define bitsSendsSrc1RegFile_1 36
#define bitsSendsSrc1AddrImmSign_0 41
#define bitsSendsSrc1AddrImmSign_1 41
#define bitsSendsSrc1AddrMode_0 42
#define bitsSendsSrc1AddrMode_1 42
#define bitsSendsSrc1AddrImm8_4_0 47
#define bitsSendsSrc1AddrImm8_4_1 43
#define bitsSendsSrc1RegNum_0 51
#define bitsSendsSrc1RegNum_1 44
#define bitsSendsSrc1AddrSubRegNum_0 51
#define bitsSendsSrc1AddrSubRegNum_1 48

#define bitsSendsDstRegFile_0 35
#define bitsSendsDstRegFile_1 35
#define bitsSendsDstSubRegNum_0 52
#define bitsSendsDstSubRegNum_1 52
#define bitsSendsDstAddrImm8_4_0 56
#define bitsSendsDstAddrImm8_4_1 52
#define bitsSendsDstRegNum_0 60
#define bitsSendsDstRegNum_1 53
#define bitsSendsDstAddrSubRegNum_0 60
#define bitsSendsDstAddrSubRegNum_1 57
#define bitsSendsDstAddrImmSign_0 62
#define bitsSendsDstAddrImmSign_1 62
#define bitsSendsDstAddrMode_0 63
#define bitsSendsDstAddrMode_1 63

#define bitsSendsSelReg32Desc_0 77
#define bitsSendsSelReg32Desc_1 77

#define bitsSendsSelReg32ExDesc_0 61
#define bitsSendsSelReg32ExDesc_1 61

#define bitsSendsSrc0AddrImmSign_0 78
#define bitsSendsSrc0AddrImmSign_1 78
#define bitsSendsSrc0AddrMode_0 79
#define bitsSendsSrc0AddrMode_1 79
#define bitsSendsSrc0AddrImm8_4_0 72
#define bitsSendsSrc0AddrImm8_4_1 68
#define bitsSendsSrc0RegNum_0 76
#define bitsSendsSrc0RegNum_1 69
#define bitsSendsSrc0AddrSubRegNum_0 76
#define bitsSendsSrc0AddrSubRegNum_1 73
#define bitsSendsSrc0Type_0 43
#define bitsSendsSrc0Type_1 43
#define bitsSendsSrc0RegFile_0 41
#define bitsSendsSrc0RegFile_1 42

#define bitsSendsExDescRegNum_0 82
#define bitsSendsExDescRegNum_1 80

// Reserved [84:84], [105:105]

////////////////////////////////////////////////
// 64 bit ISA instruction
// Version 0.0
////////////////////////////////////////////////

// Opcode [6:0] same as 128 bit

// SKL 3src special bits
#define bits3SrcSrc1Type 36
#define bits3SrcSrc2Type 35
#define bits3SrcSrc0Subregnum 84
#define bits3SrcSrc1Subregnum 105
#define bits3SrcSrc2Subregnum 126
#define bits3SrcDstSubregnum_1 55
#define bits3SrcDstSubregnum_0 53

// platform dependent bit positions for instruction fields
// these will be set dynamically once
extern unsigned long bitsFlagSubRegNum[2];
extern unsigned long bitsNibCtrl[2];
extern unsigned long bits3SrcFlagSubRegNum[2];
extern unsigned long bits3SrcSrcType[2];
extern unsigned long bits3SrcDstType[2];
extern unsigned long bits3SrcNibCtrl[2];
extern unsigned long bits3SrcDstRegFile[2];

extern unsigned long bitsDepCtrl[2];
extern unsigned long bitsWECtrl[2];
extern unsigned long bitsDstRegFile[2];
extern unsigned long bitsDstType[2];
extern unsigned long bitsDstIdxRegNum[2];
extern unsigned long bitsDstIdxImmOWord[2];
extern unsigned long bitsDstIdxImmByte[2];
extern unsigned long bitsDstIdxImmMSB[2];
extern unsigned long bitsSrcRegFile[4];
extern unsigned long bitsSrcType[4];
extern unsigned long bitsSrcIdxRegNum[4];
extern unsigned long bitsSrcIdxImmOWord[4];
extern unsigned long bitsSrcIdxImmByte[4];
extern unsigned long bitsSrcIdxImmMSB[4];
extern unsigned long bitsJIP[2];
extern unsigned long bitsUIP[2];
extern unsigned long bits3SrcSrcMod[6];

#define SET_BIT_RANGE(field, high, low)                                        \
  (field)[0] = high;                                                           \
  (field)[1] = low;

#define SET_BIT_RANGES(field, high1, low1, high2, low2)                        \
  (field)[0] = high1;                                                          \
  (field)[1] = low1;                                                           \
  (field)[2] = high2;                                                          \
  (field)[3] = low2;

#define SET_BIT_RANGES2(field, high1, low1, high2, low2, high3, low3)          \
  (field)[0] = high1;                                                          \
  (field)[1] = low1;                                                           \
  (field)[2] = high2;                                                          \
  (field)[3] = low2;                                                           \
  (field)[4] = high3;                                                          \
  (field)[5] = low3;

///////////////////////////////////////////////////////////////////////////////
// Data Structure for Binary Instructions
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// Data Structure for Binary Encoding
///////////////////////////////////////////////////////////////////////////////
namespace vISA {
class BinaryEncoding : public BinaryEncodingBase {

public:
  BinaryEncoding(Mem_Manager &m, G4_Kernel &k, const std::string& fname)
      : BinaryEncodingBase(m, k, fname) {}

  virtual ~BinaryEncoding(){

  };

private:
  void insertWaitDst(G4_INST *);
  // void insertInstPointer(G4_INST*);
  void EncodeOpCode(G4_INST *);
  void EncodeExecSize(G4_INST *);
  void EncodeQtrControl(G4_INST *);
  void EncodeAccessMode(G4_INST *);
  void EncodeFlagReg(G4_INST *);
  void EncodeFlagRegPredicate(G4_INST *);
  void EncodeCondModifier(G4_INST *);
  void EncodeInstModifier(G4_INST *);
  void EncodeMathControl(G4_INST *);
  void EncodeInstOptionsString(G4_INST *);
  void EncodeSendMsgDesc29_30(G4_INST *);

  void EncodeSrc2RegNum(G4_INST *inst, BinInst *mybin, G4_Operand *src2);
  void EncodeSrc1RegNum(G4_INST *inst, BinInst *mybin, G4_Operand *src1);
  void EncodeSrc0RegNum(G4_INST *inst, BinInst *mybin, G4_Operand *src0);
  void EncodeDstRegNum(G4_INST *inst, BinInst *mybin, G4_DstRegRegion *dst);

  /*
   * encoding operands
   */
  Status EncodeOperandDst(G4_INST *);
  Status EncodeOperandSrc0(G4_INST *);
  Status EncodeOperandSrc1(G4_INST *);
  Status EncodeOperandSrc2(G4_INST *);
  Status EncodeExtMsgDescr(G4_INST *);
  Status EncodeOperands(G4_INST *);
  Status DoAllEncoding(G4_INST *);
  Status EncodeSplitSendDst(G4_INST *);
  Status EncodeSplitSendSrc0(G4_INST *);
  Status EncodeSplitSendSrc1(G4_INST *);
  Status EncodeSplitSendSrc2(G4_INST *);

  Status EncodeIndirectCallTarget(G4_INST *);

  void SetCmpSrc1Imm32(BinInst *mybin, uint32_t immediateData, G4_Operand *src);

  virtual void SetCompactCtrl(BinInst *mybin, uint32_t value);
  virtual uint32_t GetCompactCtrl(BinInst *mybin);

  void SetBranchOffsets(G4_INST *inst, uint32_t JIP, uint32_t UIP = 0);

  // return true for backfard jumps/calls, false for forward ones
  bool EncodeConditionalBranches(G4_INST *, uint32_t);

public:
  // all platform specific bit locations are initialized here
  static void InitPlatform(TARGET_PLATFORM platform) {
    BinaryEncodingBase::InitPlatform();

    // BDW+ encoding
    SET_BIT_RANGE(bitsFlagRegNum, 33, 33);
    SET_BIT_RANGE(bitsFlagSubRegNum, 32, 32);
    SET_BIT_RANGE(bitsNibCtrl, 11, 11);
    SET_BIT_RANGE(bits3SrcFlagSubRegNum, 32, 32);
    SET_BIT_RANGE(bits3SrcFlagRegNum, 33, 33);
    SET_BIT_RANGE(bits3SrcSrcType, 45, 43);
    SET_BIT_RANGE(bits3SrcDstType, 48, 46);
    SET_BIT_RANGE(bits3SrcNibCtrl, 11, 11);

    SET_BIT_RANGE(bitsDepCtrl, 10, 9);
    SET_BIT_RANGE(bitsWECtrl, 34, 34);
    SET_BIT_RANGE(bitsDstRegFile, 36, 35);
    SET_BIT_RANGE(bitsDstType, 40, 37);
    SET_BIT_RANGE(bitsDstIdxRegNum, 60, 57);
    SET_BIT_RANGE(bitsDstIdxImmOWord, 56, 52);
    SET_BIT_RANGE(bitsDstIdxImmByte, 56, 48);
    SET_BIT_RANGE(bitsDstIdxImmMSB, 47, 47);
    SET_BIT_RANGES(bitsSrcRegFile, 42, 41, 90, 89);
    SET_BIT_RANGES(bitsSrcType, 46, 43, 94, 91);
    SET_BIT_RANGES(bitsSrcIdxRegNum, 76, 73, 108, 105);
    SET_BIT_RANGES(bitsSrcIdxImmOWord, 72, 68, 104, 100);
    SET_BIT_RANGES(bitsSrcIdxImmByte, 72, 64, 104, 96);
    SET_BIT_RANGES(bitsSrcIdxImmMSB, 95, 95, 121, 121);
    SET_BIT_RANGE(bitsJIP, 127, 96);
    SET_BIT_RANGE(bitsUIP, 95, 64);
    SET_BIT_RANGES2(bits3SrcSrcMod, 38, 37, 40, 39, 42, 41);
  }

  Status ProduceBinaryInstructions();

  // Status commitLabels();
  // Status CommitRelativeAddresses();

  virtual void DoAll();

  // Status DeleteMemForBins();

  void CompactInstructions();
  void Compact();

  // char *GetKernelBuffer() { return buffer; };
  // void SetKernelBuffer(char *_buffer) { buffer = _buffer; };

  void *alloc(size_t size) { return mem.alloc(size); };

  inline bool compactOneInstruction(G4_INST *inst) {
    G4_opcode op = inst->opcode();
    BinInst *mybin = getBinInst(inst);
    if (op == G4_if || op == G4_else || op == G4_endif || op == G4_while ||
        op == G4_halt || op == G4_break || op == G4_cont ||
        /* GetComprCtrl(mybin) == COMPR_CTRL_COMPRESSED  || */
        mybin->GetDontCompactFlag()) {
      // do not compact conditional branches
      return false;
    }

    // ToDo: disable compacting nop/return until it is clear that we can compact
    // them
    if (op == G4_nop || op == G4_return) {
      return false;
    }

    // temporary WA, to be removed later
    if (op == G4_call) {
      return false;
    }

    return BDWcompactOneInstruction(inst);
  }
};
} // namespace vISA

#endif