- *os_context_register_addr(context, t) = alloc_number(res);
- *os_context_register_addr(context, reg_ALLOC)
- = (unsigned long) dynamic_space_free_pointer;
- arch_skip_instruction(context);
-
- break;
-
- case 0: /* I_COND: ?? Maybe tagged add?? FIXME */
- badinst = *(unsigned long *)(*os_context_pc_addr(context) & ~3);
- if ((badinst&0xfffff800) == (0xb000e000|reg_ALLOC<<21|reg_ALLOC<<16)) {
- /* It is an ADDIT,OD i,ALLOC,ALLOC instruction that trapped. */
- /* That means that it is the end of a pseudo-atomic. So do the */
- /* add stripping off the pseudo-atomic-interrupted bit, and then */
- /* tell the machine-independent code to process the pseudo- */
- /* atomic. */
- int immed = (badinst>>1)&0x3ff;
- if (badinst & 1)
- immed |= -1<<10;
- *os_context_register_addr(context, reg_ALLOC) += (immed-1);
- arch_skip_instruction(context);
- interrupt_handle_pending(context);
- break;
- }
- /* else drop-through. */
+ *os_context_register_addr(context, t) = alloc_number(res);
+ *os_context_register_addr(context, reg_ALLOC)
+ = (unsigned long) dynamic_space_free_pointer;
+ arch_skip_instruction(context);
+
+ break;
+//#ifdef LINUX
+// case 0:
+//#endif
+ case FPE_COND:
+ badinst = *(unsigned int *)(*os_context_pc_addr(context) & ~3);
+ if ((badinst&0xfffff800) == (0xb000e000|reg_ALLOC<<21|reg_ALLOC<<16)) {
+ /* It is an ADDIT,OD i,ALLOC,ALLOC instruction that trapped.
+ * That means that it is the end of a pseudo-atomic. So do the
+ * add stripping off the pseudo-atomic-interrupted bit, and then
+ * tell the machine-independent code to process the pseudo-
+ * atomic. We cant skip the instruction because it holds
+ * extra-bytes that we must add to reg_alloc in context.
+ * It is so because we optimized away 'addi ,extra-bytes reg_alloc'
+ */
+ int immed = (badinst>>1)&0x3ff;
+ if (badinst & 1)
+ immed |= -1<<10;
+ *os_context_register_addr(context, reg_ALLOC) += (immed-1);
+ arch_skip_instruction(context);
+ interrupt_handle_pending(context);
+ break;
+ }
+ /* else drop-through. */