From 009f689d1be7b29b05f38f9eef816daf9f6e7f52 Mon Sep 17 00:00:00 2001 From: Klaus Treichel Date: Mon, 26 May 2008 19:46:26 +0000 Subject: [PATCH] Add the imms32 and imm32u keywords for support of signed and unsigned 32bit immediate values. --- ChangeLog | 5 ++++ tools/gen-rules-parser.y | 54 ++++++++++++++++++++++++++++++++++----- tools/gen-rules-scanner.l | 2 ++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e20b20e..67f37e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-05-26 Klaus Treichel + + * tools/gen-rules-parser.y, tools/gen-rules-scanner-l: Add the imms32 + and immu32 keywords for 32bit signed and unsigned immediate values. + 2008-05-26 Juan Jesus Garcia de Soria * include/jit/jit-defs.h.in: define JIT_EXPORT_DATA macro to support diff --git a/tools/gen-rules-parser.y b/tools/gen-rules-parser.y index f751ca4..d95384a 100644 --- a/tools/gen-rules-parser.y +++ b/tools/gen-rules-parser.y @@ -132,12 +132,14 @@ static int gensel_reserve_more_space = 128; #define GENSEL_PATT_IMMU8 7 #define GENSEL_PATT_IMMS16 8 #define GENSEL_PATT_IMMU16 9 -#define GENSEL_PATT_LOCAL 10 -#define GENSEL_PATT_FRAME 11 -#define GENSEL_PATT_SCRATCH 12 -#define GENSEL_PATT_CLOBBER 13 -#define GENSEL_PATT_IF 14 -#define GENSEL_PATT_SPACE 15 +#define GENSEL_PATT_IMMS32 10 +#define GENSEL_PATT_IMMU32 11 +#define GENSEL_PATT_LOCAL 12 +#define GENSEL_PATT_FRAME 13 +#define GENSEL_PATT_SCRATCH 14 +#define GENSEL_PATT_CLOBBER 15 +#define GENSEL_PATT_IF 16 +#define GENSEL_PATT_SPACE 17 /* * Value types. @@ -488,6 +490,8 @@ gensel_declare_regs(gensel_clause_t clauses, gensel_option_t options) case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: ++imms; break; @@ -681,6 +685,8 @@ gensel_build_arg_index( case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: if(ternary || free_dest) { if(index < 3) @@ -734,6 +740,8 @@ gensel_build_imm_arg_index( case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: if(ternary || free_dest) { if(index < 3) @@ -802,6 +810,8 @@ gensel_build_var_index( case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: names[index] = gensel_imm_names[imms]; ++imms; ++index; @@ -1121,6 +1131,30 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio ++index; break; + case GENSEL_PATT_IMMS32: + if(seen_option) + { + printf(" && "); + } + printf("insn->%s->is_nint_constant && ", args[index]); + printf("insn->%s->address >= -2147483648 && ", args[index]); + printf("insn->%s->address <= 2147483647", args[index]); + seen_option = 1; + ++index; + break; + + case GENSEL_PATT_IMMU32: + if(seen_option) + { + printf(" && "); + } + printf("insn->%s->is_nint_constant && ", args[index]); + printf("insn->%s->address >= 0 && ", args[index]); + printf("insn->%s->address <= 4294967295", args[index]); + seen_option = 1; + ++index; + break; + case GENSEL_PATT_LOCAL: if(seen_option) { @@ -1313,6 +1347,8 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: ++index; break; @@ -1492,6 +1528,8 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio case GENSEL_PATT_IMMU8: case GENSEL_PATT_IMMS16: case GENSEL_PATT_IMMU16: + case GENSEL_PATT_IMMS32: + case GENSEL_PATT_IMMU32: printf("\t\t%s = insn->%s->address;\n", gensel_imm_names[imms], args[index]); ++imms; @@ -1654,6 +1692,8 @@ static void gensel_output_supported(void) %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_IMMS32 "immediate signed 32-bit value" +%token K_IMMU32 "immediate unsigned 32-bit value" %token K_LOCAL "local variable" %token K_FRAME "local variable forced out into the stack frame" %token K_NOTE "`note'" @@ -1952,6 +1992,8 @@ InputTag | K_IMMU8 { $$ = GENSEL_PATT_IMMU8; } | K_IMMS16 { $$ = GENSEL_PATT_IMMS16; } | K_IMMU16 { $$ = GENSEL_PATT_IMMU16; } + | K_IMMS32 { $$ = GENSEL_PATT_IMMS32; } + | K_IMMU32 { $$ = GENSEL_PATT_IMMU32; } | K_LOCAL { $$ = GENSEL_PATT_LOCAL; } | K_FRAME { $$ = GENSEL_PATT_FRAME; } | K_ANY { $$ = GENSEL_PATT_ANY; } diff --git a/tools/gen-rules-scanner.l b/tools/gen-rules-scanner.l index b747787..3e99d54 100644 --- a/tools/gen-rules-scanner.l +++ b/tools/gen-rules-scanner.l @@ -96,6 +96,8 @@ WHITE [ \t\v\r\f] "immu8" { RETURNTOK(K_IMMU8); } "imms16" { RETURNTOK(K_IMMS16); } "immu16" { RETURNTOK(K_IMMU16); } +"imms32" { RETURNTOK(K_IMMS32); } +"immu32" { RETURNTOK(K_IMMU32); } "local" { RETURNTOK(K_LOCAL); } "frame" { RETURNTOK(K_FRAME); } "ternary" { RETURNTOK(K_TERNARY); } -- 2.47.3