~vcs-imports/qemu/git

« back to all changes in this revision

Viewing changes to target-mips/fop_template.c

  • Committer: pbrook
  • Date: 2006-10-22 00:18:54 UTC
  • Revision ID: git-v1:e6e5906b6e0a81718066ca43aef57515026c6624
ColdFire target.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2196 c046a42c-6fe2-441c-8c8c-71466251a162

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * MIPS emulation micro-operations templates for floating point reg
 
2
 * MIPS emulation micro-operations templates for floating point reg 
3
3
 * load & store for qemu.
4
 
 *
 
4
 * 
5
5
 * Copyright (c) 2006 Marius Groeger
6
6
 *
7
7
 * This library is free software; you can redistribute it and/or
19
19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
20
 */
21
21
 
22
 
#if defined(FREG)
23
 
 
24
 
#define OP_WLOAD_FREG(treg, tregname, FREG)              \
25
 
    void glue(glue(op_load_fpr_,tregname), FREG) (void)  \
26
 
    {                                                    \
27
 
        treg = env->fpu->fpr[FREG].w[FP_ENDIAN_IDX];    \
28
 
        FORCE_RET();                                     \
29
 
    }
30
 
 
31
 
#define OP_WSTORE_FREG(treg, tregname, FREG)             \
32
 
    void glue(glue(op_store_fpr_,tregname), FREG) (void) \
33
 
    {                                                    \
34
 
        env->fpu->fpr[FREG].w[FP_ENDIAN_IDX] = treg;    \
35
 
        FORCE_RET();                                     \
36
 
    }
37
 
 
38
 
/* WT0 = FREG.w: op_load_fpr_WT0_fprFREG */
39
 
OP_WLOAD_FREG(WT0, WT0_fpr, FREG)
40
 
/* FREG.w = WT0: op_store_fpr_WT0_fprFREG */
41
 
OP_WSTORE_FREG(WT0, WT0_fpr, FREG)
42
 
 
43
 
OP_WLOAD_FREG(WT1, WT1_fpr, FREG)
44
 
OP_WSTORE_FREG(WT1, WT1_fpr, FREG)
45
 
 
46
 
OP_WLOAD_FREG(WT2, WT2_fpr, FREG)
47
 
OP_WSTORE_FREG(WT2, WT2_fpr, FREG)
48
 
 
49
 
#define OP_DLOAD_FREG(treg, tregname, FREG)              \
50
 
    void glue(glue(op_load_fpr_,tregname), FREG) (void)  \
51
 
    {                                                    \
52
 
        if (env->hflags & MIPS_HFLAG_F64)                \
53
 
            treg = env->fpu->fpr[FREG].d;                \
54
 
        else                                             \
55
 
            treg = (uint64_t)(env->fpu->fpr[FREG | 1].w[FP_ENDIAN_IDX]) << 32 | \
56
 
                   env->fpu->fpr[FREG & ~1].w[FP_ENDIAN_IDX]; \
57
 
        FORCE_RET();                                     \
58
 
    }
59
 
 
60
 
#define OP_DSTORE_FREG(treg, tregname, FREG)             \
61
 
    void glue(glue(op_store_fpr_,tregname), FREG) (void) \
62
 
    {                                                    \
63
 
        if (env->hflags & MIPS_HFLAG_F64)                \
64
 
            env->fpu->fpr[FREG].d = treg;                \
65
 
        else {                                           \
66
 
            env->fpu->fpr[FREG | 1].w[FP_ENDIAN_IDX] = treg >> 32; \
67
 
            env->fpu->fpr[FREG & ~1].w[FP_ENDIAN_IDX] = treg;      \
68
 
        }                                                \
69
 
        FORCE_RET();                                     \
70
 
    }
71
 
 
72
 
OP_DLOAD_FREG(DT0, DT0_fpr, FREG)
73
 
OP_DSTORE_FREG(DT0, DT0_fpr, FREG)
74
 
 
75
 
OP_DLOAD_FREG(DT1, DT1_fpr, FREG)
76
 
OP_DSTORE_FREG(DT1, DT1_fpr, FREG)
77
 
 
78
 
OP_DLOAD_FREG(DT2, DT2_fpr, FREG)
79
 
OP_DSTORE_FREG(DT2, DT2_fpr, FREG)
80
 
 
81
 
#define OP_PSLOAD_FREG(treg, tregname, FREG)             \
82
 
    void glue(glue(op_load_fpr_,tregname), FREG) (void)  \
83
 
    {                                                    \
84
 
        treg = env->fpu->fpr[FREG].w[!FP_ENDIAN_IDX];   \
85
 
        FORCE_RET();                                     \
86
 
    }
87
 
 
88
 
#define OP_PSSTORE_FREG(treg, tregname, FREG)            \
89
 
    void glue(glue(op_store_fpr_,tregname), FREG) (void) \
90
 
    {                                                    \
91
 
        env->fpu->fpr[FREG].w[!FP_ENDIAN_IDX] = treg;   \
92
 
        FORCE_RET();                                     \
93
 
    }
94
 
 
95
 
OP_PSLOAD_FREG(WTH0, WTH0_fpr, FREG)
96
 
OP_PSSTORE_FREG(WTH0, WTH0_fpr, FREG)
97
 
 
98
 
OP_PSLOAD_FREG(WTH1, WTH1_fpr, FREG)
99
 
OP_PSSTORE_FREG(WTH1, WTH1_fpr, FREG)
100
 
 
101
 
OP_PSLOAD_FREG(WTH2, WTH2_fpr, FREG)
102
 
OP_PSSTORE_FREG(WTH2, WTH2_fpr, FREG)
 
22
#if defined(SFREG)
 
23
 
 
24
#define OP_WLOAD_FREG(treg, tregname, SFREG)      \
 
25
    void glue(glue(op_load_fpr_,tregname), SFREG) (void) \
 
26
    {                                                   \
 
27
        treg = FPR_W(env, SFREG);     \
 
28
        RETURN();                                       \
 
29
    }
 
30
 
 
31
#define OP_WSTORE_FREG(treg, tregname, SFREG)            \
 
32
    void glue(glue(op_store_fpr_,tregname), SFREG) (void)\
 
33
    {                                                   \
 
34
        FPR_W(env, SFREG) = treg;     \
 
35
        RETURN();                                       \
 
36
    }
 
37
 
 
38
/* WT0 = SFREG.w: op_load_fpr_WT0_fprSFREG */
 
39
OP_WLOAD_FREG(WT0, WT0_fpr, SFREG)
 
40
/* SFREG.w = WT0: op_store_fpr_WT0_fprSFREG */
 
41
OP_WSTORE_FREG(WT0, WT0_fpr, SFREG)
 
42
 
 
43
OP_WLOAD_FREG(WT1, WT1_fpr, SFREG)
 
44
OP_WSTORE_FREG(WT1, WT1_fpr, SFREG)
 
45
 
 
46
OP_WLOAD_FREG(WT2, WT2_fpr, SFREG)
 
47
OP_WSTORE_FREG(WT2, WT2_fpr, SFREG)
 
48
 
 
49
#endif
 
50
 
 
51
#if defined(DFREG)
 
52
 
 
53
#define OP_DLOAD_FREG(treg, tregname, DFREG)      \
 
54
    void glue(glue(op_load_fpr_,tregname), DFREG) (void) \
 
55
    {                                                   \
 
56
        treg = FPR_D(env, DFREG);                    \
 
57
        RETURN();                                       \
 
58
    }
 
59
 
 
60
#define OP_DSTORE_FREG(treg, tregname, DFREG)            \
 
61
    void glue(glue(op_store_fpr_,tregname), DFREG) (void)\
 
62
    {                                                   \
 
63
        FPR_D(env, DFREG) = treg;                    \
 
64
        RETURN();                                       \
 
65
    }
 
66
 
 
67
OP_DLOAD_FREG(DT0, DT0_fpr, DFREG)
 
68
OP_DSTORE_FREG(DT0, DT0_fpr, DFREG)
 
69
 
 
70
OP_DLOAD_FREG(DT1, DT1_fpr, DFREG)
 
71
OP_DSTORE_FREG(DT1, DT1_fpr, DFREG)
 
72
 
 
73
OP_DLOAD_FREG(DT2, DT2_fpr, DFREG)
 
74
OP_DSTORE_FREG(DT2, DT2_fpr, DFREG)
 
75
 
 
76
#endif
 
77
 
 
78
#if defined (FTN)
 
79
 
 
80
#define SET_RESET(treg, tregname)    \
 
81
    void glue(op_set, tregname)(void)    \
 
82
    {                                \
 
83
        treg = PARAM1;               \
 
84
        RETURN();                    \
 
85
    }                                \
 
86
    void glue(op_reset, tregname)(void)  \
 
87
    {                                \
 
88
        treg = 0;                    \
 
89
        RETURN();                    \
 
90
    }                                \
 
91
 
 
92
SET_RESET(WT0, _WT0)
 
93
SET_RESET(WT1, _WT1)
 
94
SET_RESET(WT2, _WT2)
 
95
SET_RESET(DT0, _DT0)
 
96
SET_RESET(DT1, _DT1)
 
97
SET_RESET(DT2, _DT2)
103
98
 
104
99
#endif