> Date: Wed, 17 May 2017 14:08:12 +1000
> From: David Gwynne <[email protected]>
> 
> this simplifies the asm in spllower.
> 
> the trap that break forces to run reads the new cpl value out of
> arg0 (r26) and puts the old valud in r28 (ret0). the current asm
> is convoluted in how it gets the compiler to avoid those regs across
> the asm.
> 
> right now it has gcc place the ncpl value in ret0, and uses asm to
> copy that into arg0 before the break. it lists arg0 as a clobber
> so gcc will avoid it before running this code. it also marks ret0
> as writable, which is correct.
> 
> this moves to using two register asm variables, one each for arg0
> and ret0, and only uses them as input and output operands respectively.
> this lets gcc place the ncpl value in the input register, which it
> does a good job of, and it avoids the extra copy operation.
> 
> ive only used this as part of a bigger diff. im compiling a kernel
> with just it now, but it takes ages. 180MHz cpus arent as good as
> i remember them being.
> 
> ok?

ok kettenis@

> Index: include/intr.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/hppa/include/intr.h,v
> retrieving revision 1.42
> diff -u -p -r1.42 intr.h
> --- include/intr.h    13 Sep 2015 14:58:20 -0000      1.42
> +++ include/intr.h    17 May 2017 03:58:32 -0000
> @@ -92,11 +92,15 @@ void      intr_barrier(void *);
>  static __inline int
>  spllower(int ncpl)
>  {
> -     register int ocpl asm("r28") = ncpl;
> -     __asm volatile("copy  %0, %%arg0\n\tbreak %1, %2"
> -         : "+r" (ocpl) : "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SPLLOWER)
> -         : "r26", "memory");
> -     return (ocpl);
> +     register int arg0 asm("r26") = ncpl;
> +     register int ret0 asm("r28");
> +
> +     __asm volatile("break %1, %2"
> +         : "=r" (ret0)
> +         : "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SPLLOWER), "r" (arg0)
> +         : "memory");
> +
> +     return (ret0);
>  }
>  
>  static __inline int
> 
> 
> 

Reply via email to