diff mbox

[1/6] Add TCG optimizations stub

Message ID a670c554431caa5966f7e648d545cd8b4cde9b0d.1305889001.git.batuzovk@ispras.ru
State New
Headers show

Commit Message

Kirill Batuzov May 20, 2011, 12:39 p.m. UTC
Added file tcg/optimize.c to hold TCG optimizations. Function tcg_optimize
is called from tcg_gen_code_common. It calls other functions performing
specific optimizations. Stub for constant folding was added.

Signed-off-by: Kirill Batuzov <batuzovk@ispras.ru>
---
 Makefile.target |    2 +-
 tcg/optimize.c  |   87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tcg/tcg.c       |    6 ++++
 tcg/tcg.h       |    3 ++
 4 files changed, 97 insertions(+), 1 deletions(-)
 create mode 100644 tcg/optimize.c

Comments

Richard Henderson May 20, 2011, 6:12 p.m. UTC | #1
On 05/20/2011 05:39 AM, Kirill Batuzov wrote:
> +            i = (op == INDEX_op_call) ?
> +                (args[0] >> 16) + (args[0] & 0xffff) + 3 :
> +                def->nb_args;
> +            while (i) {
> +                *gen_args = *args;
> +                args++;
> +                gen_args++;
> +                i--;
> +            }

If you use the correct NOP, i.e. nop vs nop[123n], then 
I don't believe you need to compact the arguments like this.


r~
Richard Henderson May 20, 2011, 6:33 p.m. UTC | #2
On 05/20/2011 11:12 AM, Richard Henderson wrote:
> On 05/20/2011 05:39 AM, Kirill Batuzov wrote:
>> +            i = (op == INDEX_op_call) ?
>> +                (args[0] >> 16) + (args[0] & 0xffff) + 3 :
>> +                def->nb_args;
>> +            while (i) {
>> +                *gen_args = *args;
>> +                args++;
>> +                gen_args++;
>> +                i--;
>> +            }
> 
> If you use the correct NOP, i.e. nop vs nop[123n], then 
> I don't believe you need to compact the arguments like this.

Bah, nevermind.  I forgot that we'd have to do something else
odd to replace n-operand operation opcodes with 2-operand movi.

I went back and saw Aurelien did this with a memmove in his
patch; it's probably more efficient to move pieces at a time
to fill in holes, as you do here.


r~
diff mbox

Patch

diff --git a/Makefile.target b/Makefile.target
index 21f864a..5a61778 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -70,7 +70,7 @@  all: $(PROGS) stap
 #########################################################
 # cpu emulator library
 libobj-y = exec.o translate-all.o cpu-exec.o translate.o
-libobj-y += tcg/tcg.o
+libobj-y += tcg/tcg.o tcg/optimize.o
 libobj-$(CONFIG_SOFTFLOAT) += fpu/softfloat.o
 libobj-$(CONFIG_NOSOFTFLOAT) += fpu/softfloat-native.o
 libobj-y += op_helper.o helper.o
diff --git a/tcg/optimize.c b/tcg/optimize.c
new file mode 100644
index 0000000..cf31d18
--- /dev/null
+++ b/tcg/optimize.c
@@ -0,0 +1,87 @@ 
+/*
+ * Optimizations for Tiny Code Generator for QEMU
+ *
+ * Copyright (c) 2010 Samsung Electronics.
+ * Contributed by Kirill Batuzov <batuzovk@ispras.ru>
+ *
+ * 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 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.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "qemu-common.h"
+#include "tcg-op.h"
+
+static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
+                                    TCGArg *args, TCGOpDef *tcg_op_defs)
+{
+    int i, nb_ops, op_index, op, nb_temps, nb_globals;
+    const TCGOpDef *def;
+    TCGArg *gen_args;
+
+    nb_temps = s->nb_temps;
+    nb_globals = s->nb_globals;
+
+    nb_ops = tcg_opc_ptr - gen_opc_buf;
+    gen_args = args;
+    for (op_index = 0; op_index < nb_ops; op_index++) {
+        op = gen_opc_buf[op_index];
+        def = &tcg_op_defs[op];
+        switch (op) {
+        case INDEX_op_call:
+        case INDEX_op_jmp:
+        case INDEX_op_br:
+        case INDEX_op_brcond_i32:
+        case INDEX_op_set_label:
+#if TCG_TARGET_REG_BITS == 64
+        case INDEX_op_brcond_i64:
+#endif
+            i = (op == INDEX_op_call) ?
+                (args[0] >> 16) + (args[0] & 0xffff) + 3 :
+                def->nb_args;
+            while (i) {
+                *gen_args = *args;
+                args++;
+                gen_args++;
+                i--;
+            }
+            break;
+        default:
+            for (i = 0; i < def->nb_args; i++) {
+                gen_args[i] = args[i];
+            }
+            args += def->nb_args;
+            gen_args += def->nb_args;
+            break;
+        }
+    }
+
+    return gen_args;
+}
+
+TCGArg *tcg_optimize(TCGContext *s, uint16_t *tcg_opc_ptr,
+        TCGArg *args, TCGOpDef *tcg_op_defs)
+{
+    TCGArg *res;
+    res = tcg_constant_folding(s, tcg_opc_ptr, args, tcg_op_defs);
+    return res;
+}
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 8748c05..6fb4dd6 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -24,6 +24,7 @@ 
 
 /* define it to use liveness analysis (better code) */
 #define USE_LIVENESS_ANALYSIS
+#define USE_TCG_OPTIMIZATIONS
 
 #include "config.h"
 
@@ -2018,6 +2019,11 @@  static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
     }
 #endif
 
+#ifdef USE_TCG_OPTIMIZATIONS
+    gen_opparam_ptr =
+        tcg_optimize(s, gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
+#endif
+
 #ifdef CONFIG_PROFILER
     s->la_time -= profile_getclock();
 #endif
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 3fab8d6..a85a8d7 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -486,6 +486,9 @@  void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
 void tcg_gen_shifti_i64(TCGv_i64 ret, TCGv_i64 arg1,
                         int c, int right, int arith);
 
+TCGArg *tcg_optimize(TCGContext *s, uint16_t *tcg_opc_ptr, TCGArg *args,
+                     TCGOpDef *tcg_op_def);
+
 /* only used for debugging purposes */
 void tcg_register_helper(void *func, const char *name);
 const char *tcg_helper_get_name(TCGContext *s, void *func);