mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-07 16:06:25 +00:00
From Mesa. This imports a bit more the of brw_eu* infrastructure (which is going towards the right direction!) from mesa and the update is quite a significant improvement over what we had. I also verified that the changes that were done on the assembler old version of brw_disasm.c were already supported by the Mesa version, and indeed they were. Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
200 lines
4.9 KiB
C
200 lines
4.9 KiB
C
/* -*- c-basic-offset: 8 -*- */
|
|
/*
|
|
* Copyright © 2006 Intel Corporation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
* Authors:
|
|
* Eric Anholt <eric@anholt.net>
|
|
*
|
|
*/
|
|
|
|
#include <inttypes.h>
|
|
|
|
typedef unsigned char GLubyte;
|
|
typedef short GLshort;
|
|
typedef unsigned int GLuint;
|
|
typedef int GLint;
|
|
typedef float GLfloat;
|
|
|
|
extern long int gen_level;
|
|
|
|
/* Predicate for Gen X and above */
|
|
#define IS_GENp(x) (gen_level >= (x)*10)
|
|
|
|
/* Predicate for Gen X exactly */
|
|
#define IS_GENx(x) (gen_level >= (x)*10 && gen_level < ((x)+1)*10)
|
|
|
|
/* Predicate to match Haswell processors */
|
|
#define IS_HASWELL(x) (gen_level == 75)
|
|
|
|
#include "brw_defines.h"
|
|
#include "brw_structs.h"
|
|
|
|
void yyerror (char *msg);
|
|
|
|
/**
|
|
* This structure is the internal representation of directly-addressed
|
|
* registers in the parser.
|
|
*/
|
|
struct direct_reg {
|
|
int reg_file, reg_nr, subreg_nr;
|
|
};
|
|
|
|
struct condition {
|
|
int cond;
|
|
int flag_reg_nr;
|
|
int flag_subreg_nr;
|
|
};
|
|
|
|
struct region {
|
|
int vert_stride, width, horiz_stride;
|
|
int is_default;
|
|
};
|
|
struct regtype {
|
|
int type;
|
|
int is_default;
|
|
};
|
|
/**
|
|
* This structure is the internal representation of register-indirect addressed
|
|
* registers in the parser.
|
|
*/
|
|
|
|
struct indirect_reg {
|
|
int reg_file, address_subreg_nr, indirect_offset;
|
|
};
|
|
|
|
/**
|
|
* This structure is the internal representation of destination operands in the
|
|
* parser.
|
|
*/
|
|
struct dst_operand {
|
|
int reg_file, reg_nr, subreg_nr, reg_type;
|
|
|
|
int writemask_set;
|
|
int writemask;
|
|
|
|
int horiz_stride;
|
|
int address_mode; /* 0 if direct, 1 if register-indirect */
|
|
|
|
/* Indirect addressing */
|
|
int address_subreg_nr;
|
|
int indirect_offset;
|
|
};
|
|
|
|
/**
|
|
* This structure is the internal representation of source operands in the
|
|
* parser.
|
|
*/
|
|
struct src_operand {
|
|
int reg_file, reg_nr, subreg_nr, reg_type;
|
|
|
|
int abs, negate;
|
|
|
|
int horiz_stride, width, vert_stride;
|
|
int default_region;
|
|
|
|
int address_mode; /* 0 if direct, 1 if register-indirect */
|
|
int address_subreg_nr;
|
|
int indirect_offset; /* XXX */
|
|
|
|
int swizzle_set;
|
|
int swizzle_x, swizzle_y, swizzle_z, swizzle_w;
|
|
|
|
uint32_t imm32; /* set if reg_file == BRW_IMMEDIATE_VALUE or it is expressing a branch offset */
|
|
char *reloc_target; /* bspec: branching instructions JIP and UIP are source operands */
|
|
} src_operand;
|
|
|
|
typedef struct {
|
|
enum {
|
|
imm32_d, imm32_f
|
|
} r;
|
|
union {
|
|
uint32_t d;
|
|
float f;
|
|
int32_t signed_d;
|
|
} u;
|
|
} imm32_t;
|
|
|
|
/**
|
|
* This structure is just the list container for instructions accumulated by
|
|
* the parser and labels.
|
|
*/
|
|
struct brw_program_instruction {
|
|
struct brw_instruction instruction;
|
|
struct brw_program_instruction *next;
|
|
GLuint islabel;
|
|
GLuint inst_offset;
|
|
char *string;
|
|
};
|
|
|
|
/**
|
|
* This structure is a list of instructions. It is the final output of the
|
|
* parser.
|
|
*/
|
|
struct brw_program {
|
|
struct brw_program_instruction *first;
|
|
struct brw_program_instruction *last;
|
|
};
|
|
|
|
extern struct brw_program compiled_program;
|
|
|
|
#define TYPE_B_INDEX 0
|
|
#define TYPE_UB_INDEX 1
|
|
#define TYPE_W_INDEX 2
|
|
#define TYPE_UW_INDEX 3
|
|
#define TYPE_D_INDEX 4
|
|
#define TYPE_UD_INDEX 5
|
|
#define TYPE_F_INDEX 6
|
|
|
|
#define TOTAL_TYPES 7
|
|
|
|
struct program_defaults {
|
|
int execute_size;
|
|
int execute_type[TOTAL_TYPES];
|
|
int register_type;
|
|
int register_type_regfile;
|
|
struct region source_region;
|
|
struct region source_region_type[TOTAL_TYPES];
|
|
struct region dest_region;
|
|
struct region dest_region_type[TOTAL_TYPES];
|
|
};
|
|
extern struct program_defaults program_defaults;
|
|
|
|
struct declared_register {
|
|
char *name;
|
|
struct direct_reg base;
|
|
int element_size;
|
|
struct region src_region;
|
|
int dst_region;
|
|
int type;
|
|
};
|
|
struct declared_register *find_register(char *name);
|
|
void insert_register(struct declared_register *reg);
|
|
void add_label(char *name, int addr);
|
|
int label_to_addr(char *name, int start_addr);
|
|
|
|
int yyparse(void);
|
|
int yylex(void);
|
|
int yylex_destroy(void);
|
|
|
|
char *
|
|
lex_text(void);
|