232 lines
5.9 KiB
C
232 lines
5.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>
|
|
*
|
|
*/
|
|
|
|
#ifndef __GEN4ASM_H__
|
|
#define __GEN4ASM_H__
|
|
|
|
#include <inttypes.h>
|
|
#include <stdbool.h>
|
|
#include <assert.h>
|
|
|
|
#include "brw_reg.h"
|
|
#include "brw_defines.h"
|
|
#include "brw_structs.h"
|
|
#include "gen8_instruction.h"
|
|
|
|
extern long int gen_level;
|
|
extern int advanced_flag;
|
|
extern int errors;
|
|
|
|
#define WARN_ALWAYS (1 << 0)
|
|
#define WARN_ALL (1 << 31)
|
|
extern unsigned int warning_flags;
|
|
|
|
extern char *input_filename;
|
|
|
|
extern struct brw_context genasm_context;
|
|
extern struct brw_compile genasm_compile;
|
|
|
|
/* 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)
|
|
|
|
void yyerror (char *msg);
|
|
|
|
#define STRUCT_SIZE_ASSERT(TYPE, SIZE) \
|
|
typedef struct { \
|
|
char compile_time_assert_ ## TYPE ## _size[ \
|
|
(sizeof (struct TYPE) == (SIZE)) ? 1 : -1]; \
|
|
} _ ## TYPE ## SizeCheck
|
|
|
|
/* ensure nobody changes the size of struct brw_instruction */
|
|
STRUCT_SIZE_ASSERT(brw_instruction, 16);
|
|
|
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
|
|
|
struct condition {
|
|
int cond;
|
|
int flag_reg_nr;
|
|
int flag_subreg_nr;
|
|
};
|
|
|
|
struct predicate {
|
|
unsigned pred_control:4;
|
|
unsigned pred_inverse:1;
|
|
unsigned flag_reg_nr:1;
|
|
unsigned flag_subreg_nr:1;
|
|
};
|
|
|
|
struct options {
|
|
unsigned access_mode:1;
|
|
unsigned compression_control:2; /* gen6: quater control */
|
|
unsigned thread_control:2;
|
|
unsigned dependency_control:2;
|
|
unsigned mask_control:1;
|
|
unsigned debug_control:1;
|
|
unsigned acc_wr_control:1;
|
|
|
|
unsigned end_of_thread:1;
|
|
};
|
|
|
|
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 source operands in the
|
|
* parser.
|
|
*/
|
|
struct src_operand {
|
|
struct brw_reg reg;
|
|
int default_region;
|
|
uint32_t imm32; /* set if src_operand 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;
|
|
|
|
enum assembler_instruction_type {
|
|
GEN4ASM_INSTRUCTION_GEN,
|
|
GEN4ASM_INSTRUCTION_GEN_RELOCATABLE,
|
|
GEN4ASM_INSTRUCTION_GEN8,
|
|
GEN4ASM_INSTRUCTION_GEN8_RELOCATABLE,
|
|
GEN4ASM_INSTRUCTION_LABEL,
|
|
};
|
|
|
|
struct label_instruction {
|
|
char *name;
|
|
};
|
|
|
|
struct relocation {
|
|
char *first_reloc_target, *second_reloc_target; // JIP and UIP respectively
|
|
int first_reloc_offset, second_reloc_offset; // in number of instructions
|
|
};
|
|
|
|
/**
|
|
* This structure is just the list container for instructions accumulated by
|
|
* the parser and labels.
|
|
*/
|
|
struct brw_program_instruction {
|
|
enum assembler_instruction_type type;
|
|
unsigned inst_offset;
|
|
union {
|
|
struct brw_instruction gen;
|
|
struct gen8_instruction gen8;
|
|
struct label_instruction label;
|
|
} insn;
|
|
struct relocation reloc;
|
|
struct brw_program_instruction *next;
|
|
};
|
|
|
|
static inline bool is_label(struct brw_program_instruction *instruction)
|
|
{
|
|
return instruction->type == GEN4ASM_INSTRUCTION_LABEL;
|
|
}
|
|
|
|
static inline char *label_name(struct brw_program_instruction *i)
|
|
{
|
|
assert(is_label(i));
|
|
return i->insn.label.name;
|
|
}
|
|
|
|
static inline bool is_relocatable(struct brw_program_instruction *intruction)
|
|
{
|
|
return intruction->type == GEN4ASM_INSTRUCTION_GEN_RELOCATABLE;
|
|
}
|
|
|
|
/**
|
|
* 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 brw_reg reg;
|
|
int element_size;
|
|
struct region src_region;
|
|
int dst_region;
|
|
};
|
|
struct declared_register *find_register(char *name);
|
|
void insert_register(struct declared_register *reg);
|
|
|
|
int yyparse(void);
|
|
int yylex(void);
|
|
int yylex_destroy(void);
|
|
|
|
char *
|
|
lex_text(void);
|
|
|
|
#endif /* __GEN4ASM_H__ */
|