qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 1/9] target-ppc: Consolidate instruction decode


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH 1/9] target-ppc: Consolidate instruction decode helpers
Date: Wed, 23 Nov 2016 14:56:40 +1100
User-agent: Mutt/1.7.1 (2016-10-04)

On Tue, Nov 22, 2016 at 05:15:57PM +0530, Nikunj A Dadhania wrote:
> From: Bharata B Rao <address@hidden>
> 
> Move instruction decode helpers to target-ppc/internal.h so that some
> of these can be used from outside of translate.c. This movement also
> helps to get rid of some duplicate helpers from target-ppc/fpu_helper.c.
> 
> Suggested-by: Nikunj A Dadhania <address@hidden>
> Signed-off-by: Bharata B Rao <address@hidden>
> Signed-off-by: Nikunj A Dadhania <address@hidden>

Reviewed-by: David Gibson <address@hidden>

> ---
>  target-ppc/fpu_helper.c |  11 +---
>  target-ppc/internal.h   | 151 
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c  | 151 
> ------------------------------------------------
>  3 files changed, 152 insertions(+), 161 deletions(-)
> 
> diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c
> index 8a389e1..d3741b4 100644
> --- a/target-ppc/fpu_helper.c
> +++ b/target-ppc/fpu_helper.c
> @@ -20,6 +20,7 @@
>  #include "cpu.h"
>  #include "exec/helper-proto.h"
>  #include "exec/exec-all.h"
> +#include "internal.h"
>  
>  #define float64_snan_to_qnan(x) ((x) | 0x0008000000000000ULL)
>  #define float32_snan_to_qnan(x) ((x) | 0x00400000)
> @@ -1776,16 +1777,6 @@ uint32_t helper_efdcmpeq(CPUPPCState *env, uint64_t 
> op1, uint64_t op2)
>      return helper_efdtsteq(env, op1, op2);
>  }
>  
> -#define DECODE_SPLIT(opcode, shift1, nb1, shift2, nb2) \
> -    (((((opcode) >> (shift1)) & ((1 << (nb1)) - 1)) << nb2) |    \
> -     (((opcode) >> (shift2)) & ((1 << (nb2)) - 1)))
> -
> -#define xT(opcode) DECODE_SPLIT(opcode, 0, 1, 21, 5)
> -#define xA(opcode) DECODE_SPLIT(opcode, 2, 1, 16, 5)
> -#define xB(opcode) DECODE_SPLIT(opcode, 1, 1, 11, 5)
> -#define xC(opcode) DECODE_SPLIT(opcode, 3, 1,  6, 5)
> -#define BF(opcode) (((opcode) >> (31-8)) & 7)
> -
>  typedef union _ppc_vsr_t {
>      uint64_t u64[2];
>      uint32_t u32[4];
> diff --git a/target-ppc/internal.h b/target-ppc/internal.h
> index 1ff4896..9a4a74a 100644
> --- a/target-ppc/internal.h
> +++ b/target-ppc/internal.h
> @@ -47,4 +47,155 @@ FUNC_MASK(MASK, target_ulong, 32, UINT32_MAX);
>  FUNC_MASK(mask_u32, uint32_t, 32, UINT32_MAX);
>  FUNC_MASK(mask_u64, uint64_t, 64, UINT64_MAX);
>  
> +/*****************************************************************************/
> +/***                           Instruction decoding                        
> ***/
> +#define EXTRACT_HELPER(name, shift, nb)                                      
>  \
> +static inline uint32_t name(uint32_t opcode)                                 
>  \
> +{                                                                            
>  \
> +    return (opcode >> (shift)) & ((1 << (nb)) - 1);                          
>  \
> +}
> +
> +#define EXTRACT_SHELPER(name, shift, nb)                                     
>  \
> +static inline int32_t name(uint32_t opcode)                                  
>  \
> +{                                                                            
>  \
> +    return (int16_t)((opcode >> (shift)) & ((1 << (nb)) - 1));               
>  \
> +}
> +
> +#define EXTRACT_HELPER_SPLIT(name, shift1, nb1, shift2, nb2)                 
>  \
> +static inline uint32_t name(uint32_t opcode)                                 
>  \
> +{                                                                            
>  \
> +    return (((opcode >> (shift1)) & ((1 << (nb1)) - 1)) << nb2) |            
>  \
> +            ((opcode >> (shift2)) & ((1 << (nb2)) - 1));                     
>  \
> +}
> +
> +#define EXTRACT_HELPER_DXFORM(name,                                          
>  \
> +                              d0_bits, shift_op_d0, shift_d0,                
>  \
> +                              d1_bits, shift_op_d1, shift_d1,                
>  \
> +                              d2_bits, shift_op_d2, shift_d2)                
>  \
> +static inline int16_t name(uint32_t opcode)                                  
>  \
> +{                                                                            
>  \
> +    return                                                                   
>  \
> +        (((opcode >> (shift_op_d0)) & ((1 << (d0_bits)) - 1)) << (shift_d0)) 
> | \
> +        (((opcode >> (shift_op_d1)) & ((1 << (d1_bits)) - 1)) << (shift_d1)) 
> | \
> +        (((opcode >> (shift_op_d2)) & ((1 << (d2_bits)) - 1)) << 
> (shift_d2));  \
> +}
> +
> +
> +/* Opcode part 1 */
> +EXTRACT_HELPER(opc1, 26, 6);
> +/* Opcode part 2 */
> +EXTRACT_HELPER(opc2, 1, 5);
> +/* Opcode part 3 */
> +EXTRACT_HELPER(opc3, 6, 5);
> +/* Opcode part 4 */
> +EXTRACT_HELPER(opc4, 16, 5);
> +/* Update Cr0 flags */
> +EXTRACT_HELPER(Rc, 0, 1);
> +/* Update Cr6 flags (Altivec) */
> +EXTRACT_HELPER(Rc21, 10, 1);
> +/* Destination */
> +EXTRACT_HELPER(rD, 21, 5);
> +/* Source */
> +EXTRACT_HELPER(rS, 21, 5);
> +/* First operand */
> +EXTRACT_HELPER(rA, 16, 5);
> +/* Second operand */
> +EXTRACT_HELPER(rB, 11, 5);
> +/* Third operand */
> +EXTRACT_HELPER(rC, 6, 5);
> +/***                               Get CRn                                 
> ***/
> +EXTRACT_HELPER(crfD, 23, 3);
> +EXTRACT_HELPER(BF, 23, 3);
> +EXTRACT_HELPER(crfS, 18, 3);
> +EXTRACT_HELPER(crbD, 21, 5);
> +EXTRACT_HELPER(crbA, 16, 5);
> +EXTRACT_HELPER(crbB, 11, 5);
> +/* SPR / TBL */
> +EXTRACT_HELPER(_SPR, 11, 10);
> +static inline uint32_t SPR(uint32_t opcode)
> +{
> +    uint32_t sprn = _SPR(opcode);
> +
> +    return ((sprn >> 5) & 0x1F) | ((sprn & 0x1F) << 5);
> +}
> +/***                              Get constants                            
> ***/
> +/* 16 bits signed immediate value */
> +EXTRACT_SHELPER(SIMM, 0, 16);
> +/* 16 bits unsigned immediate value */
> +EXTRACT_HELPER(UIMM, 0, 16);
> +/* 5 bits signed immediate value */
> +EXTRACT_HELPER(SIMM5, 16, 5);
> +/* 5 bits signed immediate value */
> +EXTRACT_HELPER(UIMM5, 16, 5);
> +/* 4 bits unsigned immediate value */
> +EXTRACT_HELPER(UIMM4, 16, 4);
> +/* Bit count */
> +EXTRACT_HELPER(NB, 11, 5);
> +/* Shift count */
> +EXTRACT_HELPER(SH, 11, 5);
> +/* Vector shift count */
> +EXTRACT_HELPER(VSH, 6, 4);
> +/* Mask start */
> +EXTRACT_HELPER(MB, 6, 5);
> +/* Mask end */
> +EXTRACT_HELPER(ME, 1, 5);
> +/* Trap operand */
> +EXTRACT_HELPER(TO, 21, 5);
> +
> +EXTRACT_HELPER(CRM, 12, 8);
> +
> +#ifndef CONFIG_USER_ONLY
> +EXTRACT_HELPER(SR, 16, 4);
> +#endif
> +
> +/* mtfsf/mtfsfi */
> +EXTRACT_HELPER(FPBF, 23, 3);
> +EXTRACT_HELPER(FPIMM, 12, 4);
> +EXTRACT_HELPER(FPL, 25, 1);
> +EXTRACT_HELPER(FPFLM, 17, 8);
> +EXTRACT_HELPER(FPW, 16, 1);
> +
> +/* addpcis */
> +EXTRACT_HELPER_DXFORM(DX, 10, 6, 6, 5, 16, 1, 1, 0, 0)
> +#if defined(TARGET_PPC64)
> +/* darn */
> +EXTRACT_HELPER(L, 16, 2);
> +#endif
> +
> +/***                            Jump target decoding                       
> ***/
> +/* Immediate address */
> +static inline target_ulong LI(uint32_t opcode)
> +{
> +    return (opcode >> 0) & 0x03FFFFFC;
> +}
> +
> +static inline uint32_t BD(uint32_t opcode)
> +{
> +    return (opcode >> 0) & 0xFFFC;
> +}
> +
> +EXTRACT_HELPER(BO, 21, 5);
> +EXTRACT_HELPER(BI, 16, 5);
> +/* Absolute/relative address */
> +EXTRACT_HELPER(AA, 1, 1);
> +/* Link */
> +EXTRACT_HELPER(LK, 0, 1);
> +
> +/* DFP Z22-form */
> +EXTRACT_HELPER(DCM, 10, 6)
> +
> +/* DFP Z23-form */
> +EXTRACT_HELPER(RMC, 9, 2)
> +
> +EXTRACT_HELPER_SPLIT(xT, 0, 1, 21, 5);
> +EXTRACT_HELPER_SPLIT(xS, 0, 1, 21, 5);
> +EXTRACT_HELPER_SPLIT(xA, 2, 1, 16, 5);
> +EXTRACT_HELPER_SPLIT(xB, 1, 1, 11, 5);
> +EXTRACT_HELPER_SPLIT(xC, 3, 1,  6, 5);
> +EXTRACT_HELPER(DM, 8, 2);
> +EXTRACT_HELPER(UIM, 16, 2);
> +EXTRACT_HELPER(SHW, 8, 2);
> +EXTRACT_HELPER(SP, 19, 2);
> +EXTRACT_HELPER(IMM8, 11, 8);
> +
>  #endif /* PPC_INTERNAL_H */
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 59e9552..6bdc433 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -422,157 +422,6 @@ typedef struct opcode_t {
>  
>  #define CHK_NONE
>  
> -
> -/*****************************************************************************/
> -/***                           Instruction decoding                        
> ***/
> -#define EXTRACT_HELPER(name, shift, nb)                                      
>  \
> -static inline uint32_t name(uint32_t opcode)                                 
>  \
> -{                                                                            
>  \
> -    return (opcode >> (shift)) & ((1 << (nb)) - 1);                          
>  \
> -}
> -
> -#define EXTRACT_SHELPER(name, shift, nb)                                     
>  \
> -static inline int32_t name(uint32_t opcode)                                  
>  \
> -{                                                                            
>  \
> -    return (int16_t)((opcode >> (shift)) & ((1 << (nb)) - 1));               
>  \
> -}
> -
> -#define EXTRACT_HELPER_SPLIT(name, shift1, nb1, shift2, nb2)                 
>  \
> -static inline uint32_t name(uint32_t opcode)                                 
>  \
> -{                                                                            
>  \
> -    return (((opcode >> (shift1)) & ((1 << (nb1)) - 1)) << nb2) |            
>  \
> -            ((opcode >> (shift2)) & ((1 << (nb2)) - 1));                     
>  \
> -}
> -
> -#define EXTRACT_HELPER_DXFORM(name,                                          
>  \
> -                              d0_bits, shift_op_d0, shift_d0,                
>  \
> -                              d1_bits, shift_op_d1, shift_d1,                
>  \
> -                              d2_bits, shift_op_d2, shift_d2)                
>  \
> -static inline int16_t name(uint32_t opcode)                                  
>  \
> -{                                                                            
>  \
> -    return                                                                   
>  \
> -        (((opcode >> (shift_op_d0)) & ((1 << (d0_bits)) - 1)) << (shift_d0)) 
> | \
> -        (((opcode >> (shift_op_d1)) & ((1 << (d1_bits)) - 1)) << (shift_d1)) 
> | \
> -        (((opcode >> (shift_op_d2)) & ((1 << (d2_bits)) - 1)) << 
> (shift_d2));  \
> -}
> -
> -
> -/* Opcode part 1 */
> -EXTRACT_HELPER(opc1, 26, 6);
> -/* Opcode part 2 */
> -EXTRACT_HELPER(opc2, 1, 5);
> -/* Opcode part 3 */
> -EXTRACT_HELPER(opc3, 6, 5);
> -/* Opcode part 4 */
> -EXTRACT_HELPER(opc4, 16, 5);
> -/* Update Cr0 flags */
> -EXTRACT_HELPER(Rc, 0, 1);
> -/* Update Cr6 flags (Altivec) */
> -EXTRACT_HELPER(Rc21, 10, 1);
> -/* Destination */
> -EXTRACT_HELPER(rD, 21, 5);
> -/* Source */
> -EXTRACT_HELPER(rS, 21, 5);
> -/* First operand */
> -EXTRACT_HELPER(rA, 16, 5);
> -/* Second operand */
> -EXTRACT_HELPER(rB, 11, 5);
> -/* Third operand */
> -EXTRACT_HELPER(rC, 6, 5);
> -/***                               Get CRn                                 
> ***/
> -EXTRACT_HELPER(crfD, 23, 3);
> -EXTRACT_HELPER(crfS, 18, 3);
> -EXTRACT_HELPER(crbD, 21, 5);
> -EXTRACT_HELPER(crbA, 16, 5);
> -EXTRACT_HELPER(crbB, 11, 5);
> -/* SPR / TBL */
> -EXTRACT_HELPER(_SPR, 11, 10);
> -static inline uint32_t SPR(uint32_t opcode)
> -{
> -    uint32_t sprn = _SPR(opcode);
> -
> -    return ((sprn >> 5) & 0x1F) | ((sprn & 0x1F) << 5);
> -}
> -/***                              Get constants                            
> ***/
> -/* 16 bits signed immediate value */
> -EXTRACT_SHELPER(SIMM, 0, 16);
> -/* 16 bits unsigned immediate value */
> -EXTRACT_HELPER(UIMM, 0, 16);
> -/* 5 bits signed immediate value */
> -EXTRACT_HELPER(SIMM5, 16, 5);
> -/* 5 bits signed immediate value */
> -EXTRACT_HELPER(UIMM5, 16, 5);
> -/* 4 bits unsigned immediate value */
> -EXTRACT_HELPER(UIMM4, 16, 4);
> -/* Bit count */
> -EXTRACT_HELPER(NB, 11, 5);
> -/* Shift count */
> -EXTRACT_HELPER(SH, 11, 5);
> -/* Vector shift count */
> -EXTRACT_HELPER(VSH, 6, 4);
> -/* Mask start */
> -EXTRACT_HELPER(MB, 6, 5);
> -/* Mask end */
> -EXTRACT_HELPER(ME, 1, 5);
> -/* Trap operand */
> -EXTRACT_HELPER(TO, 21, 5);
> -
> -EXTRACT_HELPER(CRM, 12, 8);
> -
> -#ifndef CONFIG_USER_ONLY
> -EXTRACT_HELPER(SR, 16, 4);
> -#endif
> -
> -/* mtfsf/mtfsfi */
> -EXTRACT_HELPER(FPBF, 23, 3);
> -EXTRACT_HELPER(FPIMM, 12, 4);
> -EXTRACT_HELPER(FPL, 25, 1);
> -EXTRACT_HELPER(FPFLM, 17, 8);
> -EXTRACT_HELPER(FPW, 16, 1);
> -
> -/* addpcis */
> -EXTRACT_HELPER_DXFORM(DX, 10, 6, 6, 5, 16, 1, 1, 0, 0)
> -#if defined(TARGET_PPC64)
> -/* darn */
> -EXTRACT_HELPER(L, 16, 2);
> -#endif
> -
> -/***                            Jump target decoding                       
> ***/
> -/* Immediate address */
> -static inline target_ulong LI(uint32_t opcode)
> -{
> -    return (opcode >> 0) & 0x03FFFFFC;
> -}
> -
> -static inline uint32_t BD(uint32_t opcode)
> -{
> -    return (opcode >> 0) & 0xFFFC;
> -}
> -
> -EXTRACT_HELPER(BO, 21, 5);
> -EXTRACT_HELPER(BI, 16, 5);
> -/* Absolute/relative address */
> -EXTRACT_HELPER(AA, 1, 1);
> -/* Link */
> -EXTRACT_HELPER(LK, 0, 1);
> -
> -/* DFP Z22-form */
> -EXTRACT_HELPER(DCM, 10, 6)
> -
> -/* DFP Z23-form */
> -EXTRACT_HELPER(RMC, 9, 2)
> -
> -EXTRACT_HELPER_SPLIT(xT, 0, 1, 21, 5);
> -EXTRACT_HELPER_SPLIT(xS, 0, 1, 21, 5);
> -EXTRACT_HELPER_SPLIT(xA, 2, 1, 16, 5);
> -EXTRACT_HELPER_SPLIT(xB, 1, 1, 11, 5);
> -EXTRACT_HELPER_SPLIT(xC, 3, 1,  6, 5);
> -EXTRACT_HELPER(DM, 8, 2);
> -EXTRACT_HELPER(UIM, 16, 2);
> -EXTRACT_HELPER(SHW, 8, 2);
> -EXTRACT_HELPER(SP, 19, 2);
> -EXTRACT_HELPER(IMM8, 11, 8);
> -
>  
> /*****************************************************************************/
>  /* PowerPC instructions table                                                
> */
>  

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

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