tcg: Use tcg_malloc to allocate TCGLabelQemuLdst
Pre-allocating 640 of them per TB is a waste. Reviewed-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									7ccfb495c6
								
							
						
					
					
						commit
						686461c962
					
				| 
						 | 
				
			
			@ -21,7 +21,6 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SOFTMMU
 | 
			
		||||
#define TCG_MAX_QEMU_LDST       640
 | 
			
		||||
 | 
			
		||||
typedef struct TCGLabelQemuLdst {
 | 
			
		||||
    bool is_ld;             /* qemu_ld: true, qemu_st: false */
 | 
			
		||||
| 
						 | 
				
			
			@ -34,11 +33,11 @@ typedef struct TCGLabelQemuLdst {
 | 
			
		|||
    int mem_index;          /* soft MMU memory index */
 | 
			
		||||
    tcg_insn_unit *raddr;   /* gen code addr of the next IR of qemu_ld/st IR */
 | 
			
		||||
    tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */
 | 
			
		||||
    struct TCGLabelQemuLdst *next;
 | 
			
		||||
} TCGLabelQemuLdst;
 | 
			
		||||
 | 
			
		||||
typedef struct TCGBackendData {
 | 
			
		||||
    int nb_ldst_labels;
 | 
			
		||||
    TCGLabelQemuLdst ldst_labels[TCG_MAX_QEMU_LDST];
 | 
			
		||||
    TCGLabelQemuLdst *labels;
 | 
			
		||||
} TCGBackendData;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +47,7 @@ typedef struct TCGBackendData {
 | 
			
		|||
 | 
			
		||||
static inline void tcg_out_tb_init(TCGContext *s)
 | 
			
		||||
{
 | 
			
		||||
    s->be->nb_ldst_labels = 0;
 | 
			
		||||
    s->be->labels = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -60,15 +59,14 @@ static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
 | 
			
		|||
 | 
			
		||||
static void tcg_out_tb_finalize(TCGContext *s)
 | 
			
		||||
{
 | 
			
		||||
    TCGLabelQemuLdst *lb = s->be->ldst_labels;
 | 
			
		||||
    int i, n = s->be->nb_ldst_labels;
 | 
			
		||||
    TCGLabelQemuLdst *lb;
 | 
			
		||||
 | 
			
		||||
    /* qemu_ld/st slow paths */
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
        if (lb[i].is_ld) {
 | 
			
		||||
            tcg_out_qemu_ld_slow_path(s, lb + i);
 | 
			
		||||
    for (lb = s->be->labels; lb != NULL; lb = lb->next) {
 | 
			
		||||
        if (lb->is_ld) {
 | 
			
		||||
            tcg_out_qemu_ld_slow_path(s, lb);
 | 
			
		||||
        } else {
 | 
			
		||||
            tcg_out_qemu_st_slow_path(s, lb + i);
 | 
			
		||||
            tcg_out_qemu_st_slow_path(s, lb);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -80,11 +78,11 @@ static void tcg_out_tb_finalize(TCGContext *s)
 | 
			
		|||
static inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
 | 
			
		||||
{
 | 
			
		||||
    TCGBackendData *be = s->be;
 | 
			
		||||
    int n = be->nb_ldst_labels;
 | 
			
		||||
    TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
 | 
			
		||||
 | 
			
		||||
    assert(n < TCG_MAX_QEMU_LDST);
 | 
			
		||||
    be->nb_ldst_labels = n + 1;
 | 
			
		||||
    return &be->ldst_labels[n];
 | 
			
		||||
    l->next = be->labels;
 | 
			
		||||
    be->labels = l;
 | 
			
		||||
    return l;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
#include "tcg-be-null.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue