about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/signals.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index f4c17edc..5ca91776 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -827,6 +827,22 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         p->uc_mcontext.pc+=4;   // go to next opcode
         return 1;
     }
+    if((opcode&0b10111111111111111111110000000000)==0b00001101000000001000010000000000) {
+        // this is ST1.D
+        int idx = (opcode>>30)&1;
+        int val = opcode&31;
+        int dest = (opcode>>5)&31;
+        volatile uint8_t* addr = (void*)(p->uc_mcontext.regs[dest]);
+        uint64_t value = fpsimd->vregs[val]>>(idx*64);
+        if((((uintptr_t)addr)&3)==0) {
+            for(int i=0; i<2; ++i)
+                ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
+        } else
+            for(int i=0; i<8; ++i)
+                addr[i] = (value>>(i*8))&0xff;
+        p->uc_mcontext.pc+=4;   // go to next opcode
+        return 1;
+    }
 #endif
     return 0;
 }