[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] libjit ChangeLog tools/Makefile.am tools/gen-se...
From: |
Aleksey Demakov |
Subject: |
[dotgnu-pnet-commits] libjit ChangeLog tools/Makefile.am tools/gen-se... |
Date: |
Sat, 07 Feb 2009 12:03:30 +0000 |
CVSROOT: /sources/dotgnu-pnet
Module name: libjit
Changes by: Aleksey Demakov <avd> 09/02/07 12:03:30
Modified files:
. : ChangeLog
tools : Makefile.am
Removed files:
tools : gen-sel-parser.y gen-sel-scanner.l
Log message:
remove obsolete gen-sel tool
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.405&r2=1.406
http://cvs.savannah.gnu.org/viewcvs/libjit/tools/Makefile.am?cvsroot=dotgnu-pnet&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/libjit/tools/gen-sel-parser.y?cvsroot=dotgnu-pnet&r1=1.16&r2=0
http://cvs.savannah.gnu.org/viewcvs/libjit/tools/gen-sel-scanner.l?cvsroot=dotgnu-pnet&r1=1.9&r2=0
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.405
retrieving revision 1.406
diff -u -b -r1.405 -r1.406
--- ChangeLog 6 Feb 2009 18:22:31 -0000 1.405
+++ ChangeLog 7 Feb 2009 12:03:30 -0000 1.406
@@ -1,3 +1,8 @@
+2009-02-07 avd <address@hidden>
+
+ * gen-sel-parser.y, gen-sel-scanner.l: remove obsolete files.
+ * tools/Makefile.am: remove gen-sel target.
+
2009-02-06 Klaus Treichel <address@hidden>
* jit/jit-apply-x86.h: Add @PLT to the definition of JIT_MEMCPY to
Index: tools/Makefile.am
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/tools/Makefile.am,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- tools/Makefile.am 13 Nov 2007 09:19:24 -0000 1.5
+++ tools/Makefile.am 7 Feb 2009 12:03:30 -0000 1.6
@@ -1,5 +1,5 @@
-noinst_PROGRAMS = gen-apply gen-rules gen-sel
+noinst_PROGRAMS = gen-apply gen-rules
noinst_HEADERS = gen-apply-macosx.h
@@ -7,15 +7,10 @@
gen_rules_SOURCES = gen-rules-parser.y gen-rules-scanner.l
-gen_sel_SOURCES = gen-sel-parser.y \
- gen-sel-scanner.l
-
AM_YFLAGS = -d
gen-rules-scanner.l: gen-rules-parser.c
-gen-sel-scanner.l: gen-sel-parser.c
-
all-local: $(top_builddir)/jit/jit-apply-rules.h
$(top_builddir)/jit/jit-apply-rules.h: gen-apply$(EXEEXT)
@@ -25,5 +20,4 @@
-I$(top_srcdir)/jit -I$(top_builddir)/jit
CLEANFILES = $(top_builddir)/jit/jit-apply-rules.h \
- gen-rules-parser.c gen-rules-parser.h gen-rules-scanner.c \
- gen-sel-parser.c gen-sel-parser.h gen-sel-scanner.c
+ gen-rules-parser.c gen-rules-parser.h gen-rules-scanner.c
Index: tools/gen-sel-parser.y
===================================================================
RCS file: tools/gen-sel-parser.y
diff -N tools/gen-sel-parser.y
--- tools/gen-sel-parser.y 27 Feb 2008 08:53:41 -0000 1.16
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,1008 +0,0 @@
-%{
-/*
- * gen-sel-parser.y - Bison grammar for the "gen-sel" program.
- *
- * Copyright (C) 2004 Southern Storm Software, Pty Ltd.
- *
- * This file is part of the libjit library.
- *
- * The libjit library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation, either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * The libjit library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the libjit library. If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-#include <stdio.h>
-#ifdef HAVE_STRING_H
- #include <string.h>
-#elif defined(HAVE_STRINGS_H)
- #include <strings.h>
-#endif
-#ifdef HAVE_STDLIB_H
- #include <stdlib.h>
-#endif
-
-/*
- * Imports from the lexical analyser.
- */
-extern int yylex(void);
-extern void yyrestart(FILE *file);
-#ifdef YYTEXT_POINTER
-extern char *yytext;
-#else
-extern char yytext[];
-#endif
-
-/*
- * Report error messages from the parser.
- */
-static void yyerror(char *msg)
-{
- puts(msg);
-}
-
-/*
- * Current file and line number.
- */
-extern char *gensel_filename;
-extern long gensel_linenum;
-
-/*
- * Instruction type for the "inst" variable.
- */
-static char *gensel_inst_type = "unsigned char *";
-static int gensel_new_inst_type = 0;
-
-/*
- * Amount of space to reserve for the primary instruction output.
- */
-static int gensel_reserve_space = 32;
-static int gensel_reserve_more_space = 128;
-
-/*
- * First register in a stack arrangement.
- */
-static int gensel_first_stack_reg = 8; /* st0 under x86 */
-
-/*
- * Option values.
- */
-#define GENSEL_OPT_SPILL_BEFORE 0x0001
-#define GENSEL_OPT_BINARY 0x0002
-#define GENSEL_OPT_UNARY 0x0004
-#define GENSEL_OPT_TERNARY 0x0008
-#define GENSEL_OPT_STACK 0x0010
-#define GENSEL_OPT_UNARY_BRANCH 0x0020
-#define GENSEL_OPT_BINARY_BRANCH 0x0040
-#define GENSEL_OPT_ONLY 0x0080
-#define GENSEL_OPT_MANUAL 0x0100
-#define GENSEL_OPT_UNARY_NOTE 0x0200
-#define GENSEL_OPT_BINARY_NOTE 0x0400
-#define GENSEL_OPT_MORE_SPACE 0x0800
-
-/*
- * Pattern values.
- */
-#define GENSEL_PATT_END 0
-#define GENSEL_PATT_REG 1
-#define GENSEL_PATT_LREG 2
-#define GENSEL_PATT_FREG 3
-#define GENSEL_PATT_IMM 4
-#define GENSEL_PATT_IMMZERO 5
-#define GENSEL_PATT_IMMS8 6
-#define GENSEL_PATT_IMMU8 7
-#define GENSEL_PATT_IMMS16 8
-#define GENSEL_PATT_IMMU16 9
-#define GENSEL_PATT_LOCAL 10
-
-/*
- * Information about clauses.
- */
-typedef struct gensel_clause *gensel_clause_t;
-struct gensel_clause
-{
- int pattern[8];
- char *filename;
- long linenum;
- char *code;
- gensel_clause_t next;
-};
-
-/*
- * Free a list of clauses.
- */
-static void gensel_free_clauses(gensel_clause_t clauses)
-{
- gensel_clause_t next;
- while(clauses != 0)
- {
- next = clauses->next;
- free(clauses->code);
- free(clauses);
- clauses = next;
- }
-}
-
-/*
- * Declare the register variables that are needed for a set of clauses.
- */
-static void gensel_declare_regs(gensel_clause_t clauses, int options)
-{
- int have_reg1 = 0;
- int have_reg2 = 0;
- int have_reg3 = 0;
- int have_imm = 0;
- int have_local = 0;
- int index;
- while(clauses != 0)
- {
- for(index = 0; clauses->pattern[index] != GENSEL_PATT_END;
++index)
- {
- switch(clauses->pattern[index])
- {
- case GENSEL_PATT_REG:
- case GENSEL_PATT_LREG:
- case GENSEL_PATT_FREG:
- {
- if(index == 0)
- have_reg1 = 1;
- else if(index == 1)
- have_reg2 = 1;
- else
- have_reg3 = 1;
- }
- break;
-
- case GENSEL_PATT_IMMZERO: break;
-
- case GENSEL_PATT_IMM:
- case GENSEL_PATT_IMMS8:
- case GENSEL_PATT_IMMU8:
- case GENSEL_PATT_IMMS16:
- case GENSEL_PATT_IMMU16:
- {
- have_imm = 1;
- }
- break;
-
- case GENSEL_PATT_LOCAL:
- {
- have_local = 1;
- }
- break;
- }
- }
- clauses = clauses->next;
- }
- if(have_reg1)
- {
- printf("\tint reg;\n");
- }
- if(have_reg2 && (options & GENSEL_OPT_STACK) == 0)
- {
- printf("\tint reg2;\n");
- }
- if(have_reg3 && (options & GENSEL_OPT_STACK) == 0)
- {
- printf("\tint reg3;\n");
- }
- if(have_imm)
- {
- printf("\tjit_nint imm_value;\n");
- }
- if(have_local)
- {
- printf("\tjit_nint local_offset;\n");
- }
-}
-
-/*
- * Output the code within a clause.
- */
-static void gensel_output_clause_code(gensel_clause_t clause)
-{
- char *code;
- int index;
-
- /* Output the line number information from the original file */
- printf("#line %ld \"%s\"\n", clause->linenum, clause->filename);
-
- /* Output the clause code */
- printf("\t\t");
- code = clause->code;
- while(*code != '\0')
- {
- if(*code == '$' && code[1] >= '1' && code[1] <= '9')
- {
- index = code[1] - '1';
- switch(clause->pattern[index])
- {
- case GENSEL_PATT_REG:
- case GENSEL_PATT_LREG:
- case GENSEL_PATT_FREG:
- {
- if(index == 0)
-
printf("_jit_reg_info[reg].cpu_reg");
- else if(index == 1)
-
printf("_jit_reg_info[reg2].cpu_reg");
- else
-
printf("_jit_reg_info[reg3].cpu_reg");
- }
- break;
-
- case GENSEL_PATT_IMM:
- case GENSEL_PATT_IMMZERO:
- case GENSEL_PATT_IMMS8:
- case GENSEL_PATT_IMMU8:
- case GENSEL_PATT_IMMS16:
- case GENSEL_PATT_IMMU16:
- {
- printf("imm_value");
- }
- break;
-
- case GENSEL_PATT_LOCAL:
- {
- printf("local_offset");
- }
- break;
- }
- code += 2;
- }
- else if(*code == '%' && code[1] >= '1' && code[1] <= '9')
- {
- index = code[1] - '1';
- switch(clause->pattern[index])
- {
- case GENSEL_PATT_REG:
- case GENSEL_PATT_LREG:
- case GENSEL_PATT_FREG:
- {
- if(index == 0)
-
printf("_jit_reg_info[_jit_reg_info[reg].other_reg].cpu_reg");
- else if(index == 1)
-
printf("_jit_reg_info[_jit_reg_info[reg2].other_reg].cpu_reg");
- else
-
printf("_jit_reg_info[_jit_reg_info[reg3].other_reg].cpu_reg");
- }
- break;
- }
- code += 2;
- }
- else if(*code == '\n')
- {
- putc(*code, stdout);
- putc('\t', stdout);
- ++code;
- }
- else
- {
- putc(*code, stdout);
- ++code;
- }
- }
- printf("\n");
-}
-
-/*
- * Output a single clause for a rule.
- */
-static void gensel_output_clause(gensel_clause_t clause, int options)
-{
- /* Cache the instruction pointer into "inst" */
- if(gensel_new_inst_type)
- {
- printf("\t\tjit_gen_load_inst_ptr(gen, inst);\n");
- }
- else
- {
- printf("\t\tinst = (%s)(gen->posn.ptr);\n", gensel_inst_type);
- printf("\t\tif(!jit_cache_check_for_n(&(gen->posn), %d))\n",
- (((options & GENSEL_OPT_MORE_SPACE) == 0)
- ? gensel_reserve_space :
gensel_reserve_more_space));
- printf("\t\t{\n");
- printf("\t\t\tjit_cache_mark_full(&(gen->posn));\n");
- printf("\t\t\treturn;\n");
- printf("\t\t}\n");
- }
-
- /* Output the clause code */
- gensel_output_clause_code(clause);
-
- /* Copy "inst" back into the generation context */
- if(gensel_new_inst_type)
- {
- printf("\t\tjit_gen_save_inst_ptr(gen, inst);\n");
- }
- else
- {
- printf("\t\tgen->posn.ptr = (unsigned char *)inst;\n");
- }
-}
-
-/*
- * Output the clauses for a rule.
- */
-static void gensel_output_clauses(gensel_clause_t clauses, int options)
-{
- const char *arg1;
- const char *arg2;
- const char *arg3;
- const char *arg;
- const char *reg;
- const char *flag1;
- const char *flag2;
- const char *flag3;
- const char *flag;
- int destroy1;
- int destroy2;
- int destroy3;
- int destroy;
- gensel_clause_t clause;
- int first, index;
- int check_index;
-
- /* If the clause is manual, then output it as-is */
- if((options & GENSEL_OPT_MANUAL) != 0)
- {
- gensel_output_clause_code(clauses);
- return;
- }
-
- /* Determine the location of this instruction's arguments */
- if((options & GENSEL_OPT_TERNARY) != 0)
- {
- arg1 = "insn->dest";
- arg2 = "insn->value1";
- arg3 = "insn->value2";
- flag1 = "DEST";
- flag2 = "VALUE1";
- flag3 = "VALUE2";
- destroy1 = 0;
- destroy2 = 0;
- destroy3 = 0;
- }
- else
- {
- arg1 = "insn->value1";
- arg2 = "insn->value2";
- arg3 = "??";
- flag1 = "VALUE1";
- flag2 = "VALUE2";
- flag3 = "??";
- if((options & (GENSEL_OPT_BINARY_BRANCH |
- GENSEL_OPT_UNARY_BRANCH |
- GENSEL_OPT_BINARY_NOTE |
- GENSEL_OPT_UNARY_NOTE)) != 0)
- {
- destroy1 = 0;
- }
- else
- {
- destroy1 = 1;
- }
- destroy2 = 0;
- destroy3 = 0;
- }
-
- /* If all of the clauses start with a register, then load the first
- value into a register before we start checking cases */
- check_index = 0;
- if((options & (GENSEL_OPT_BINARY | GENSEL_OPT_UNARY |
- GENSEL_OPT_BINARY_BRANCH |
GENSEL_OPT_UNARY_BRANCH |
- GENSEL_OPT_BINARY_NOTE |
GENSEL_OPT_UNARY_NOTE)) != 0 &&
- (options & GENSEL_OPT_STACK) == 0)
- {
- clause = clauses;
- while(clause != 0)
- {
- if(clause->pattern[0] != GENSEL_PATT_REG &&
- clause->pattern[0] != GENSEL_PATT_LREG &&
- clause->pattern[0] != GENSEL_PATT_FREG)
- {
- break;
- }
- clause = clause->next;
- }
- if(!clause)
- {
- printf("\treg = _jit_regs_load_value(gen, %s, %d, ",
- arg1, destroy1);
- printf("(insn->flags & (JIT_INSN_%s_NEXT_USE | "
-
"JIT_INSN_%s_LIVE)));\n", flag1, flag1);
- check_index = 1;
- }
- }
-
- /* Output the clause checking and dispatching code */
- clause = clauses;
- first = 1;
- while(clause != 0)
- {
- if(clause->next)
- {
- if(first)
- printf("\tif(");
- else
- printf("\telse if(");
- for(index = check_index; clause->pattern[index];
++index)
- {
- if(index == 0)
- arg = arg1;
- else if(index == 1)
- arg = arg2;
- else
- arg = arg3;
- switch(clause->pattern[index])
- {
- case GENSEL_PATT_REG:
- case GENSEL_PATT_LREG:
- case GENSEL_PATT_FREG:
- {
- printf("%s->in_register", arg);
- }
- break;
-
- case GENSEL_PATT_IMM:
- {
- printf("%s->is_constant", arg);
- }
- break;
-
- case GENSEL_PATT_IMMZERO:
- {
- printf("%s->is_nint_constant &&
", arg);
- printf("%s->address == 0", arg);
- }
- break;
-
- case GENSEL_PATT_IMMS8:
- {
- printf("%s->is_nint_constant &&
", arg);
- printf("%s->address >= -128 &&
", arg);
- printf("%s->address <= 127",
arg);
- }
- break;
-
- case GENSEL_PATT_IMMU8:
- {
- printf("%s->is_nint_constant &&
", arg);
- printf("%s->address >= 0 && ",
arg);
- printf("%s->address <= 255",
arg);
- }
- break;
-
- case GENSEL_PATT_IMMS16:
- {
- printf("%s->is_nint_constant &&
", arg);
- printf("%s->address >= -32768
&& ", arg);
- printf("%s->address <= 32767",
arg);
- }
- break;
-
- case GENSEL_PATT_IMMU16:
- {
- printf("%s->is_nint_constant &&
", arg);
- printf("%s->address >= 0 && ",
arg);
- printf("%s->address <= 65535",
arg);
- }
- break;
-
- case GENSEL_PATT_LOCAL:
- {
- printf("%s->in_frame &&
!(%s->in_register)", arg, arg);
- }
- break;
- }
- if(clause->pattern[index + 1])
- {
- printf(" && ");
- }
- }
- printf(")\n\t{\n");
- }
- else if(first)
- {
- printf("\t{\n");
- }
- else
- {
- printf("\telse\n\t{\n");
- }
- if((options & GENSEL_OPT_STACK) == 0 || clause->next)
- {
- for(index = check_index; clause->pattern[index];
++index)
- {
- if(index == 0)
- {
- arg = arg1;
- reg = "reg";
- flag = flag1;
- destroy = destroy1;
- }
- else if(index == 1)
- {
- arg = arg2;
- reg = "reg2";
- flag = flag2;
- destroy = destroy2;
- }
- else
- {
- arg = arg3;
- reg = "reg3";
- flag = flag3;
- destroy = destroy3;
- }
- switch(clause->pattern[index])
- {
- case GENSEL_PATT_REG:
- case GENSEL_PATT_LREG:
- case GENSEL_PATT_FREG:
- {
- printf("\t\t%s =
_jit_regs_load_value(gen, %s, %d, ",
- reg, arg, destroy);
- printf("(insn->flags &
(JIT_INSN_%s_NEXT_USE | "
-
"JIT_INSN_%s_LIVE)));\n",
- flag, flag);
- }
- break;
-
- case GENSEL_PATT_IMMZERO: break;
-
- case GENSEL_PATT_IMM:
- case GENSEL_PATT_IMMS8:
- case GENSEL_PATT_IMMU8:
- case GENSEL_PATT_IMMS16:
- case GENSEL_PATT_IMMU16:
- {
- printf("\t\timm_value =
%s->address;\n", arg);
- }
- break;
-
- case GENSEL_PATT_LOCAL:
- {
- printf("\t\tlocal_offset =
%s->frame_offset;\n", arg);
- }
- break;
- }
- }
- }
- else
- {
- if((options & GENSEL_OPT_ONLY) != 0)
- {
- printf("\t\tif(!_jit_regs_is_top(gen,
insn->value1) ||\n");
- printf("\t\t _jit_regs_num_used(gen, %d) !=
1)\n",
- gensel_first_stack_reg);
- printf("\t\t{\n");
- printf("\t\t\t_jit_regs_spill_all(gen);\n");
- printf("\t\t}\n");
- }
- if((options & GENSEL_OPT_TERNARY) != 0)
- {
- printf("\t\treg =
_jit_regs_load_to_top_three\n");
- printf("\t\t\t(gen, insn->dest, insn->value1,
insn->value2,\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_DEST_NEXT_USE | "
-
"JIT_INSN_DEST_LIVE)),\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_VALUE1_NEXT_USE | "
-
"JIT_INSN_VALUE1_LIVE)),\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_VALUE2_NEXT_USE | "
-
"JIT_INSN_VALUE2_LIVE)), "
-
"%d);\n",
- gensel_first_stack_reg);
- }
- else if((options & (GENSEL_OPT_BINARY |
-
GENSEL_OPT_BINARY_BRANCH)) != 0)
- {
- printf("\t\treg = _jit_regs_load_to_top_two\n");
- printf("\t\t\t(gen, insn->value1,
insn->value2,\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_VALUE1_NEXT_USE | "
-
"JIT_INSN_VALUE1_LIVE)),\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_VALUE2_NEXT_USE | "
-
"JIT_INSN_VALUE2_LIVE)), "
-
"%d);\n",
- gensel_first_stack_reg);
- }
- else if((options & (GENSEL_OPT_UNARY |
-
GENSEL_OPT_UNARY_BRANCH |
-
GENSEL_OPT_UNARY_NOTE)) != 0)
- {
- printf("\t\treg = _jit_regs_load_to_top\n");
- printf("\t\t\t(gen, insn->value1,\n");
- printf("\t\t\t\t(insn->flags &
(JIT_INSN_VALUE1_NEXT_USE | "
-
"JIT_INSN_VALUE1_LIVE)), "
-
"%d);\n",
- gensel_first_stack_reg);
- }
- }
- if((options & (GENSEL_OPT_BINARY_BRANCH |
- GENSEL_OPT_UNARY_BRANCH)) != 0)
- {
- /* Spill all other registers back to their original
positions */
- printf("\t\t_jit_regs_spill_all(gen);\n");
- }
- gensel_output_clause(clause, options);
- printf("\t}\n");
- first = 0;
- clause = clause->next;
- }
-}
-
-/*
- * List of opcodes that are supported by the input rules.
- */
-static char **supported = 0;
-static char **supported_options = 0;
-static int num_supported = 0;
-
-/*
- * Add an opcode to the supported list.
- */
-static void gensel_add_supported(char *name, char *option)
-{
- supported = (char **)realloc
- (supported, (num_supported + 1) * sizeof(char *));
- if(!supported)
- {
- exit(1);
- }
- supported[num_supported] = name;
- supported_options = (char **)realloc
- (supported_options, (num_supported + 1) * sizeof(char *));
- if(!supported_options)
- {
- exit(1);
- }
- supported_options[num_supported++] = option;
-}
-
-/*
- * Output the list of supported opcodes.
- */
-static void gensel_output_supported(void)
-{
- int index;
- for(index = 0; index < num_supported; ++index)
- {
- if(supported_options[index])
- {
- if(supported_options[index][0] == '!')
- {
- printf("#ifndef %s\n", supported_options[index]
+ 1);
- }
- else
- {
- printf("#ifdef %s\n", supported_options[index]);
- }
- printf("case %s:\n", supported[index]);
- printf("#endif\n");
- }
- else
- {
- printf("case %s:\n", supported[index]);
- }
- }
- printf("\treturn 1;\n\n");
-}
-
-%}
-
-/*
- * Define the structure of yylval.
- */
-%union {
- char *name;
- struct
- {
- char *filename;
- long linenum;
- char *block;
- } code;
- int options;
- struct
- {
- int elem[8];
- int size;
-
- } pattern;
- struct
- {
- struct gensel_clause *head;
- struct gensel_clause *tail;
-
- } clauses;
-}
-
-/*
- * Primitive lexical tokens and keywords.
- */
-%token IDENTIFIER "an identifier"
-%token CODE_BLOCK "a code block"
-%token K_PTR "`->'"
-%token K_REG "word register"
-%token K_LREG "long register"
-%token K_FREG "float register"
-%token K_IMM "immediate value"
-%token K_IMMZERO "immediate zero value"
-%token K_IMMS8 "immediate signed 8-bit value"
-%token K_IMMU8 "immediate unsigned 8-bit value"
-%token K_IMMS16 "immediate signed 16-bit value"
-%token K_IMMU16 "immediate unsigned 16-bit
value"
-%token K_LOCAL "local variable"
-%token K_SPILL_BEFORE "`spill_before'"
-%token K_BINARY "`binary'"
-%token K_UNARY "`unary'"
-%token K_UNARY_BRANCH "`unary_branch'"
-%token K_BINARY_BRANCH "`binary_branch'"
-%token K_UNARY_NOTE "`unary_note'"
-%token K_BINARY_NOTE "`binary_note'"
-%token K_TERNARY "`ternary'"
-%token K_STACK "`stack'"
-%token K_ONLY "`only'"
-%token K_MORE_SPACE "`more_space'"
-%token K_MANUAL "`manual'"
-%token K_INST_TYPE "`%inst_type'"
-
-/*
- * Define the yylval types of the various non-terminals.
- */
-%type <name> IDENTIFIER IfClause IdentifierList
-%type <code> CODE_BLOCK
-%type <options> Options OptionList Option
PatternElement
-%type <clauses> Clauses Clause
-%type <pattern> Pattern Pattern2
-
-%expect 0
-
-%start Start
-%%
-
-Start
- : /* empty */
- | Rules
- ;
-
-Rules
- : Rule
- | Rules Rule
- ;
-
-Rule
- : IdentifierList IfClause ':' Options Clauses {
- if($2)
- {
- if(($2)[0] == '!')
- {
- printf("#ifndef %s\n\n", $2 +
1);
- }
- else
- {
- printf("#ifdef %s\n\n", $2);
- }
- }
- printf("case %s:\n{\n", $1);
- if(($4 & GENSEL_OPT_MANUAL) == 0)
- {
- printf("\t%s inst;\n",
gensel_inst_type);
- }
- gensel_declare_regs($5.head, $4);
- if(($4 & GENSEL_OPT_SPILL_BEFORE) != 0)
- {
- printf("\t_jit_regs_spill_all(gen);\n");
- }
- gensel_output_clauses($5.head, $4);
- if(($4 & (GENSEL_OPT_BINARY |
GENSEL_OPT_UNARY)) != 0)
- {
- printf("\tif((insn->flags &
JIT_INSN_DEST_NEXT_USE) != 0)\n");
- printf("\t{\n");
- printf("\t\t_jit_regs_set_value(gen,
reg, insn->dest, 0);\n");
- printf("\t}\n");
- printf("\telse\n");
- printf("\t{\n");
- printf("\t\tint other_reg;\n");
-
printf("\t\tif(gen->contents[reg].is_long_start)\n");
- printf("\t\t{\n");
- printf("\t\t\tother_reg =
_jit_reg_info[reg].other_reg;\n");
- printf("\t\t}\n");
- printf("\t\telse\n");
- printf("\t\t{\n");
- printf("\t\t\tother_reg = -1;\n");
- printf("\t\t}\n");
- printf("\t\t_jit_gen_spill_reg(gen,
reg, other_reg, insn->dest);\n");
-
printf("\t\tif(insn->dest->has_global_register)\n");
-
printf("\t\t\tinsn->dest->in_global_register = 1;\n");
- printf("\t\telse\n");
- printf("\t\t\tinsn->dest->in_frame =
1;\n");
- printf("\t\t_jit_regs_free_reg(gen,
reg, 1);\n");
- printf("\t}\n");
- }
- printf("}\nbreak;\n\n");
- if($2)
- {
- printf("#endif /* %s */\n\n", $2);
- }
- gensel_free_clauses($5.head);
- gensel_add_supported($1, $2);
- }
- | K_INST_TYPE IDENTIFIER {
- gensel_inst_type = $2;
- gensel_new_inst_type = 1;
- }
- ;
-
-IdentifierList
- : IDENTIFIER { $$ = $1; }
- | IdentifierList ',' IDENTIFIER {
- char *result = (char *)malloc(strlen($1) +
strlen($3) + 16);
- if(!result)
- {
- exit(1);
- }
- strcpy(result, $1);
- strcat(result, ":\ncase ");
- strcat(result, $3);
- free($1);
- free($3);
- $$ = result;
- }
- ;
-
-IfClause
- : /* empty */ { $$ = 0; }
- | '(' IDENTIFIER ')' { $$ = $2; }
- ;
-
-Options
- : /* empty */ { $$ = 0; }
- | OptionList { $$ = $1; }
- ;
-
-OptionList
- : Option { $$ = $1; }
- | OptionList ',' Option { $$ = $1 | $3; }
- ;
-
-Option
- : K_SPILL_BEFORE { $$ = GENSEL_OPT_SPILL_BEFORE;
}
- | K_BINARY { $$ =
GENSEL_OPT_BINARY; }
- | K_UNARY { $$ =
GENSEL_OPT_UNARY; }
- | K_UNARY_BRANCH { $$ = GENSEL_OPT_UNARY_BRANCH;
}
- | K_BINARY_BRANCH { $$ =
GENSEL_OPT_BINARY_BRANCH; }
- | K_UNARY_NOTE { $$ = GENSEL_OPT_UNARY_NOTE; }
- | K_BINARY_NOTE { $$ = GENSEL_OPT_BINARY_NOTE; }
- | K_TERNARY { $$ =
GENSEL_OPT_TERNARY; }
- | K_STACK { $$ =
GENSEL_OPT_STACK; }
- | K_ONLY { $$ = GENSEL_OPT_ONLY;
}
- | K_MORE_SPACE { $$ = GENSEL_OPT_MORE_SPACE; }
- | K_MANUAL { $$ =
GENSEL_OPT_MANUAL; }
- ;
-
-Clauses
- : Clause { $$ = $1; }
- | Clauses Clause {
- $1.tail->next = $2.head;
- $$.head = $1.head;
- $$.tail = $2.tail;
- }
- ;
-
-Clause
- : '[' Pattern ']' K_PTR CODE_BLOCK {
- gensel_clause_t clause;
- int index;
- clause = (gensel_clause_t)malloc(sizeof(struct
gensel_clause));
- if(!clause)
- {
- exit(1);
- }
- for(index = 0; index < 8; ++index)
- {
- clause->pattern[index] = $2.elem[index];
- }
- clause->filename = $5.filename;
- clause->linenum = $5.linenum;
- clause->code = $5.block;
- clause->next = 0;
- $$.head = clause;
- $$.tail = clause;
- }
- ;
-
-Pattern
- : /* empty */ {
- $$.elem[0] = GENSEL_PATT_END;
- $$.size = 0;
- }
- | Pattern2 { $$ = $1; }
- ;
-
-Pattern2
- : PatternElement {
- $$.elem[0] = $1;
- $$.elem[1] = GENSEL_PATT_END;
- $$.size = 1;
- }
- | Pattern2 ',' PatternElement {
- $$.elem[$1.size] = $3;
- $$.elem[$1.size + 1] = GENSEL_PATT_END;
- $$.size = $1.size + 1;
- }
- ;
-
-PatternElement
- : K_REG { $$ = GENSEL_PATT_REG;
}
- | K_LREG { $$ =
GENSEL_PATT_LREG; }
- | K_FREG { $$ =
GENSEL_PATT_FREG; }
- | K_IMM { $$ = GENSEL_PATT_IMM;
}
- | K_IMMZERO { $$ =
GENSEL_PATT_IMMZERO; }
- | K_IMMS8 { $$ =
GENSEL_PATT_IMMS8; }
- | K_IMMU8 { $$ =
GENSEL_PATT_IMMU8; }
- | K_IMMS16 { $$ =
GENSEL_PATT_IMMS16; }
- | K_IMMU16 { $$ =
GENSEL_PATT_IMMU16; }
- | K_LOCAL { $$ =
GENSEL_PATT_LOCAL; }
- ;
-
-%%
-
-#define COPYRIGHT_MSG \
-" * Copyright (C) 2004 Southern Storm Software, Pty Ltd.\n" \
-" *\n" \
-" * This file is part of the libjit library.\n" \
-" *\n" \
-" * The libjit library is free software: you can redistribute it and/or\n" \
-" * modify it under the terms of the GNU Lesser General Public License\n" \
-" * as published by the Free Software Foundation, either version 2.1 of\n" \
-" * the License, or (at your option) any later version.\n" \
-" *\n" \
-" * The libjit library is distributed in the hope that it will be useful,\n" \
-" * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
-" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" \
-" * Lesser General Public License for more details.\n" \
-" *\n" \
-" * You should have received a copy of the GNU Lesser General Public\n" \
-" * License along with the libjit library. If not, see\n" \
-" * <http://www.gnu.org/licenses/>.\n"
-
-int main(int argc, char *argv[])
-{
- FILE *file;
- if(argc != 2)
- {
- fprintf(stderr, "Usage: %s input.sel >output.slc\n", argv[0]);
- return 1;
- }
- file = fopen(argv[1], "r");
- if(!file)
- {
- perror(argv[1]);
- return 1;
- }
- printf("/%c Automatically generated from %s - DO NOT EDIT %c/\n",
- '*', argv[1], '*');
- printf("/%c\n%s%c/\n\n", '*', COPYRIGHT_MSG, '*');
- printf("#if defined(JIT_INCLUDE_RULES)\n\n");
- gensel_filename = argv[1];
- gensel_linenum = 1;
- yyrestart(file);
- if(yyparse())
- {
- fclose(file);
- return 1;
- }
- fclose(file);
- printf("#elif defined(JIT_INCLUDE_SUPPORTED)\n\n");
- gensel_output_supported();
- printf("#endif\n");
- return 0;
-}
Index: tools/gen-sel-scanner.l
===================================================================
RCS file: tools/gen-sel-scanner.l
diff -N tools/gen-sel-scanner.l
--- tools/gen-sel-scanner.l 23 May 2008 11:00:43 -0000 1.9
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,230 +0,0 @@
-%{
-/*
- * gen-sel-scanner.l - Lex input file for the "gen-sel" scanner.
- *
- * Copyright (C) 2004 Southern Storm Software, Pty Ltd.
- *
- * This file is part of the libjit library.
- *
- * The libjit library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation, either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * The libjit library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the libjit library. If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include "gen-sel-parser.h"
-#include <config.h>
-#ifdef HAVE_STRING_H
- #include <string.h>
-#elif defined(HAVE_STRINGS_H)
- #include <strings.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
- #include <stdlib.h>
-#endif
-#ifndef HAVE_UNISTD_H
- #define YY_NO_UNISTD_H
-#endif
-
-extern YYSTYPE yylval;
-
-/*
- * Current file and line number.
- */
-char *gensel_filename = "";
-long gensel_linenum = 1;
-
-/*
- * Return a token code from the lexical analyser.
- */
-#define RETURNTOK(x) return (x)
-
-/*
- * Forward declarations.
- */
-static void gensel_skip_comment(void);
-static char *gensel_read_block(void);
-
-/*
- * Duplicate a string.
- */
-static char *gensel_strdup(const char *str)
-{
- char *new_str;
- if(!str)
- {
- return 0;
- }
- new_str = (char *)malloc(strlen(str) + 1);
- if(!new_str)
- {
- return 0;
- }
- strcpy(new_str, str);
- return new_str;
-}
-
-%}
-
-%option outfile="lex.yy.c"
-%option noyywrap
-%option nounput
-
-DIGIT [0-9]
-IDALPHA [a-zA-Z_]
-WHITE [ \t\v\r\f]
-
-%%
-
-"->" { RETURNTOK(K_PTR); }
-"reg" { RETURNTOK(K_REG); }
-"lreg" { RETURNTOK(K_LREG); }
-"freg" { RETURNTOK(K_FREG); }
-"imm" { RETURNTOK(K_IMM); }
-"immzero" { RETURNTOK(K_IMMZERO); }
-"imms8" { RETURNTOK(K_IMMS8); }
-"immu8" { RETURNTOK(K_IMMU8); }
-"imms16" { RETURNTOK(K_IMMS16); }
-"immu16" { RETURNTOK(K_IMMU16); }
-"local" { RETURNTOK(K_LOCAL); }
-"spill_before" { RETURNTOK(K_SPILL_BEFORE); }
-"binary" { RETURNTOK(K_BINARY); }
-"unary" { RETURNTOK(K_UNARY); }
-"ternary" { RETURNTOK(K_TERNARY); }
-"unary_branch" { RETURNTOK(K_UNARY_BRANCH); }
-"binary_branch" { RETURNTOK(K_BINARY_BRANCH); }
-"unary_note" { RETURNTOK(K_UNARY_NOTE); }
-"binary_note" { RETURNTOK(K_BINARY_NOTE); }
-"manual" { RETURNTOK(K_MANUAL); }
-"stack" { RETURNTOK(K_STACK); }
-"only" { RETURNTOK(K_ONLY); }
-"more_space" { RETURNTOK(K_MORE_SPACE); }
-"%inst_type" { RETURNTOK(K_INST_TYPE); }
-
-"!"?{IDALPHA}({DIGIT}|{IDALPHA})* {
- yylval.name = gensel_strdup(yytext);
- if(!(yylval.name))
- {
- exit(1);
- }
- RETURNTOK(IDENTIFIER);
- }
-
-{WHITE}+ ;
-
-\n {
++gensel_linenum; }
-
-"{" {
yylval.code.filename = gensel_filename;
-
yylval.code.linenum = gensel_linenum;
-
yylval.code.block = gensel_read_block();
-
RETURNTOK(CODE_BLOCK); }
-
-"/*" {
gensel_skip_comment(); }
-
-. {
RETURNTOK(((int)(yytext[0])) & 0xFF); }
-
-%%
-
-/*
- * Skip a comment in the input stream.
- */
-static void gensel_skip_comment(void)
-{
- int ch;
- for(;;)
- {
- ch = input();
- if(ch == EOF)
- {
- break;
- }
- else if(ch == '*')
- {
- ch = input();
- while(ch == '*')
- {
- ch = input();
- }
- if(ch == EOF || ch == '/')
- {
- break;
- }
- else if(ch == '\n')
- {
- ++gensel_linenum;
- }
- }
- else if(ch == '\n')
- {
- ++gensel_linenum;
- }
- }
-}
-
-/*
- * Add a character to a reallocatable buffer.
- */
-#define ADD_CH(c) \
- do { \
- if((buflen + 1) >= bufmax) \
- { \
- buf = (char *)realloc(buf, bufmax + 64); \
- if(!buf) \
- { \
- exit(1); \
- } \
- bufmax += 64; \
- } \
- buf[buflen++] = (char)c; \
- buf[buflen] = (char)'\0'; \
- } while (0)
-
-/*
- * Read a literal code block from the input stream.
- */
-static char *gensel_read_block(void)
-{
- char *buf = 0;
- int buflen = 0;
- int bufmax = 0;
- int ch;
- int level = 1;
- ADD_CH('{');
- for(;;)
- {
- ch = input();
- if(ch == EOF)
- {
- fprintf(stderr, "Unexpected EOF in code block\n");
- exit(1);
- }
- ADD_CH(ch);
- if(ch == '{')
- {
- ++level;
- }
- else if(ch == '\n')
- {
- ++gensel_linenum;
- }
- else if(ch == '}')
- {
- --level;
- if(level == 0)
- {
- break;
- }
- }
- }
- return buf;
-}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] libjit ChangeLog tools/Makefile.am tools/gen-se...,
Aleksey Demakov <=