lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] lightning: Only optimize movr for regular registers


From: Paul Cercueil
Subject: [PATCH] lightning: Only optimize movr for regular registers
Date: Thu, 22 Jun 2023 18:58:03 +0200

When a jit_movr() or jit_movi() targets a register that is not used by
Lightning, the opcode should be emitted or undefined behaviour may
occur.

This makes it possible to read/write system registers using jit_movr(),
for instance the GBR register on SuperH processors, which is generally
used as the base address of the thread-local storage data.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
 lib/lightning.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/lightning.c b/lib/lightning.c
index 95502e5..5f49643 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -3585,11 +3585,21 @@ _simplify_movr(jit_state_t *_jit, jit_node_t *prev, 
jit_node_t *node,
 {
     jit_int32_t                 regno;
     jit_int32_t                 right;
+    jit_int32_t                 spec;
     jit_value_t                *value;
 
     regno = jit_regno(node->u.w);
     right = jit_regno(node->v.w);
     value = _jitc->values + regno;
+
+    spec = jit_class(_rvs[regno].spec);
+    if (!(spec & (jit_class_gpr | jit_class_xpr | jit_class_fpr))) {
+       /* reserved register */
+       value->kind = 0;
+       ++_jitc->gen[regno];
+       return (0);
+    }
+
     if ((value->kind == jit_kind_register &&
         jit_regno(value->base.q.l) == right &&
         value->base.q.h == _jitc->gen[right]) ||
@@ -3627,12 +3637,18 @@ _simplify_movi(jit_state_t *_jit, jit_node_t *prev, 
jit_node_t *node,
        ++_jitc->gen[regno];
        return (0);
     }
+    spec = jit_class(_rvs[regno].spec);
+    if (!(spec & (jit_class_gpr | jit_class_xpr | jit_class_fpr))) {
+       /* reserved register */
+       value->kind = 0;
+       ++_jitc->gen[regno];
+       return (0);
+    }
     if (value->kind == kind) {
        if (memcmp(&node->v.w, &value->base.w, size) == 0) {
            del_node(prev, node);
            return (1);
        }
-       spec = jit_class(_rvs[regno].spec);
        if (kind == jit_kind_word)
            spec &= jit_class_gpr;
        else
-- 
2.40.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]