Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
libtcg
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Anton
libtcg
Commits
89b2e37e
Commit
89b2e37e
authored
7 years ago
by
Richard Henderson
Browse files
Options
Downloads
Patches
Plain Diff
tcg/mips: Fully convert tcg_target_op_def
Signed-off-by:
Richard Henderson
<
richard.henderson@linaro.org
>
parent
9be44a16
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tcg/mips/tcg-target.inc.c
+170
-154
170 additions, 154 deletions
tcg/mips/tcg-target.inc.c
with
170 additions
and
154 deletions
tcg/mips/tcg-target.inc.c
+
170
−
154
View file @
89b2e37e
...
...
@@ -2163,166 +2163,182 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
}
}
static
const
TCGTargetOpDef
mips_op_defs
[]
=
{
{
INDEX_op_exit_tb
,
{
}
},
{
INDEX_op_goto_tb
,
{
}
},
{
INDEX_op_br
,
{
}
},
{
INDEX_op_goto_ptr
,
{
"r"
}
},
{
INDEX_op_ld8u_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld8s_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld16u_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld16s_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_st8_i32
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_st16_i32
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_st_i32
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_add_i32
,
{
"r"
,
"rZ"
,
"rJ"
}
},
{
INDEX_op_mul_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
#if !use_mips32r6_instructions
{
INDEX_op_muls2_i32
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_mulu2_i32
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
}
},
#endif
{
INDEX_op_mulsh_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_muluh_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_div_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_divu_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_rem_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_remu_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_sub_i32
,
{
"r"
,
"rZ"
,
"rN"
}
},
{
INDEX_op_and_i32
,
{
"r"
,
"rZ"
,
"rIK"
}
},
{
INDEX_op_nor_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_not_i32
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_or_i32
,
{
"r"
,
"rZ"
,
"rIZ"
}
},
{
INDEX_op_xor_i32
,
{
"r"
,
"rZ"
,
"rIZ"
}
},
{
INDEX_op_shl_i32
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_shr_i32
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_sar_i32
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_rotr_i32
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_rotl_i32
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_clz_i32
,
{
"r"
,
"r"
,
"rWZ"
}
},
{
INDEX_op_bswap16_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_bswap32_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_ext8s_i32
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_ext16s_i32
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_deposit_i32
,
{
"r"
,
"0"
,
"rZ"
}
},
{
INDEX_op_extract_i32
,
{
"r"
,
"r"
}
},
{
INDEX_op_brcond_i32
,
{
"rZ"
,
"rZ"
}
},
#if use_mips32r6_instructions
{
INDEX_op_movcond_i32
,
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
},
#else
{
INDEX_op_movcond_i32
,
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"0"
}
},
#endif
{
INDEX_op_setcond_i32
,
{
"r"
,
"rZ"
,
"rZ"
}
},
static
const
TCGTargetOpDef
*
tcg_target_op_def
(
TCGOpcode
op
)
{
static
const
TCGTargetOpDef
r
=
{
.
args_ct_str
=
{
"r"
}
};
static
const
TCGTargetOpDef
r_r
=
{
.
args_ct_str
=
{
"r"
,
"r"
}
};
static
const
TCGTargetOpDef
r_L
=
{
.
args_ct_str
=
{
"r"
,
"L"
}
};
static
const
TCGTargetOpDef
rZ_r
=
{
.
args_ct_str
=
{
"rZ"
,
"r"
}
};
static
const
TCGTargetOpDef
SZ_S
=
{
.
args_ct_str
=
{
"SZ"
,
"S"
}
};
static
const
TCGTargetOpDef
rZ_rZ
=
{
.
args_ct_str
=
{
"rZ"
,
"rZ"
}
};
static
const
TCGTargetOpDef
r_r_L
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"L"
}
};
static
const
TCGTargetOpDef
r_L_L
=
{
.
args_ct_str
=
{
"r"
,
"L"
,
"L"
}
};
static
const
TCGTargetOpDef
r_r_ri
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"ri"
}
};
static
const
TCGTargetOpDef
r_r_rI
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rI"
}
};
static
const
TCGTargetOpDef
r_r_rJ
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rJ"
}
};
static
const
TCGTargetOpDef
SZ_S_S
=
{
.
args_ct_str
=
{
"SZ"
,
"S"
,
"S"
}
};
static
const
TCGTargetOpDef
SZ_SZ_S
=
{
.
args_ct_str
=
{
"SZ"
,
"SZ"
,
"S"
}
};
static
const
TCGTargetOpDef
SZ_SZ_S_S
=
{
.
args_ct_str
=
{
"SZ"
,
"SZ"
,
"S"
,
"S"
}
};
static
const
TCGTargetOpDef
r_rZ_rN
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
,
"rN"
}
};
static
const
TCGTargetOpDef
r_rZ_rZ
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
,
"rZ"
}
};
static
const
TCGTargetOpDef
r_r_rIK
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rIK"
}
};
static
const
TCGTargetOpDef
r_r_rWZ
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rWZ"
}
};
static
const
TCGTargetOpDef
r_r_r_r
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"r"
,
"r"
}
};
static
const
TCGTargetOpDef
r_r_L_L
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"L"
,
"L"
}
};
static
const
TCGTargetOpDef
dep
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"rZ"
}
};
static
const
TCGTargetOpDef
movc
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"0"
}
};
static
const
TCGTargetOpDef
movc_r6
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
};
static
const
TCGTargetOpDef
add2
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rZ"
,
"rZ"
,
"rN"
,
"rN"
}
};
static
const
TCGTargetOpDef
br2
=
{
.
args_ct_str
=
{
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
};
static
const
TCGTargetOpDef
setc2
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
};
switch
(
op
)
{
case
INDEX_op_goto_ptr
:
return
&
r
;
#if TCG_TARGET_REG_BITS == 32
{
INDEX_op_add2_i32
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
,
"rN"
,
"rN"
}
},
{
INDEX_op_sub2_i32
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
,
"rN"
,
"rN"
}
},
{
INDEX_op_setcond2_i32
,
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_brcond2_i32
,
{
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
},
#endif
case
INDEX_op_ld8u_i32
:
case
INDEX_op_ld8s_i32
:
case
INDEX_op_ld16u_i32
:
case
INDEX_op_ld16s_i32
:
case
INDEX_op_ld_i32
:
case
INDEX_op_not_i32
:
case
INDEX_op_bswap16_i32
:
case
INDEX_op_bswap32_i32
:
case
INDEX_op_ext8s_i32
:
case
INDEX_op_ext16s_i32
:
case
INDEX_op_extract_i32
:
case
INDEX_op_ld8u_i64
:
case
INDEX_op_ld8s_i64
:
case
INDEX_op_ld16u_i64
:
case
INDEX_op_ld16s_i64
:
case
INDEX_op_ld32s_i64
:
case
INDEX_op_ld32u_i64
:
case
INDEX_op_ld_i64
:
case
INDEX_op_not_i64
:
case
INDEX_op_bswap16_i64
:
case
INDEX_op_bswap32_i64
:
case
INDEX_op_bswap64_i64
:
case
INDEX_op_ext8s_i64
:
case
INDEX_op_ext16s_i64
:
case
INDEX_op_ext32s_i64
:
case
INDEX_op_ext32u_i64
:
case
INDEX_op_ext_i32_i64
:
case
INDEX_op_extu_i32_i64
:
case
INDEX_op_extrl_i64_i32
:
case
INDEX_op_extrh_i64_i32
:
case
INDEX_op_extract_i64
:
return
&
r_r
;
#if TCG_TARGET_REG_BITS == 64
{
INDEX_op_ld8u_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld8s_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld16u_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld16s_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld32s_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld32u_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ld_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_st8_i64
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_st16_i64
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_st32_i64
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_st_i64
,
{
"rZ"
,
"r"
}
},
{
INDEX_op_add_i64
,
{
"r"
,
"rZ"
,
"rJ"
}
},
{
INDEX_op_mul_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
#if !use_mips32r6_instructions
{
INDEX_op_muls2_i64
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_mulu2_i64
,
{
"r"
,
"r"
,
"rZ"
,
"rZ"
}
},
#endif
{
INDEX_op_mulsh_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_muluh_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_div_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_divu_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_rem_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_remu_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_sub_i64
,
{
"r"
,
"rZ"
,
"rN"
}
},
{
INDEX_op_and_i64
,
{
"r"
,
"rZ"
,
"rIK"
}
},
{
INDEX_op_nor_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_not_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_or_i64
,
{
"r"
,
"rZ"
,
"rI"
}
},
{
INDEX_op_xor_i64
,
{
"r"
,
"rZ"
,
"rI"
}
},
{
INDEX_op_shl_i64
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_shr_i64
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_sar_i64
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_rotr_i64
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_rotl_i64
,
{
"r"
,
"rZ"
,
"ri"
}
},
{
INDEX_op_clz_i64
,
{
"r"
,
"r"
,
"rWZ"
}
},
{
INDEX_op_bswap16_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_bswap32_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_bswap64_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_ext8s_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_ext16s_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_ext32s_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_ext32u_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_ext_i32_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_extu_i32_i64
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_extrl_i64_i32
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_extrh_i64_i32
,
{
"r"
,
"rZ"
}
},
{
INDEX_op_deposit_i64
,
{
"r"
,
"0"
,
"rZ"
}
},
{
INDEX_op_extract_i64
,
{
"r"
,
"r"
}
},
{
INDEX_op_brcond_i64
,
{
"rZ"
,
"rZ"
}
},
#if use_mips32r6_instructions
{
INDEX_op_movcond_i64
,
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"rZ"
}
},
#else
{
INDEX_op_movcond_i64
,
{
"r"
,
"rZ"
,
"rZ"
,
"rZ"
,
"0"
}
},
#endif
{
INDEX_op_setcond_i64
,
{
"r"
,
"rZ"
,
"rZ"
}
},
{
INDEX_op_qemu_ld_i32
,
{
"r"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i32
,
{
"SZ"
,
"SZ"
}
},
{
INDEX_op_qemu_ld_i64
,
{
"r"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i64
,
{
"SZ"
,
"SZ"
}
},
#elif TARGET_LONG_BITS == 32
{
INDEX_op_qemu_ld_i32
,
{
"r"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i32
,
{
"SZ"
,
"SZ"
}
},
{
INDEX_op_qemu_ld_i64
,
{
"r"
,
"r"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i64
,
{
"SZ"
,
"SZ"
,
"SZ"
}
},
#else
{
INDEX_op_qemu_ld_i32
,
{
"r"
,
"LZ"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i32
,
{
"SZ"
,
"SZ"
,
"SZ"
}
},
{
INDEX_op_qemu_ld_i64
,
{
"r"
,
"r"
,
"LZ"
,
"LZ"
}
},
{
INDEX_op_qemu_st_i64
,
{
"SZ"
,
"SZ"
,
"SZ"
,
"SZ"
}
},
#endif
case
INDEX_op_st8_i32
:
case
INDEX_op_st16_i32
:
case
INDEX_op_st_i32
:
case
INDEX_op_st8_i64
:
case
INDEX_op_st16_i64
:
case
INDEX_op_st32_i64
:
case
INDEX_op_st_i64
:
return
&
rZ_r
;
{
INDEX_op_mb
,
{
}
},
{
-
1
},
};
case
INDEX_op_add_i32
:
case
INDEX_op_add_i64
:
return
&
r_r_rJ
;
case
INDEX_op_sub_i32
:
case
INDEX_op_sub_i64
:
return
&
r_rZ_rN
;
case
INDEX_op_mul_i32
:
case
INDEX_op_mulsh_i32
:
case
INDEX_op_muluh_i32
:
case
INDEX_op_div_i32
:
case
INDEX_op_divu_i32
:
case
INDEX_op_rem_i32
:
case
INDEX_op_remu_i32
:
case
INDEX_op_nor_i32
:
case
INDEX_op_setcond_i32
:
case
INDEX_op_mul_i64
:
case
INDEX_op_mulsh_i64
:
case
INDEX_op_muluh_i64
:
case
INDEX_op_div_i64
:
case
INDEX_op_divu_i64
:
case
INDEX_op_rem_i64
:
case
INDEX_op_remu_i64
:
case
INDEX_op_nor_i64
:
case
INDEX_op_setcond_i64
:
return
&
r_rZ_rZ
;
case
INDEX_op_muls2_i32
:
case
INDEX_op_mulu2_i32
:
case
INDEX_op_muls2_i64
:
case
INDEX_op_mulu2_i64
:
return
&
r_r_r_r
;
case
INDEX_op_and_i32
:
case
INDEX_op_and_i64
:
return
&
r_r_rIK
;
case
INDEX_op_or_i32
:
case
INDEX_op_xor_i32
:
case
INDEX_op_or_i64
:
case
INDEX_op_xor_i64
:
return
&
r_r_rI
;
case
INDEX_op_shl_i32
:
case
INDEX_op_shr_i32
:
case
INDEX_op_sar_i32
:
case
INDEX_op_rotr_i32
:
case
INDEX_op_rotl_i32
:
case
INDEX_op_shl_i64
:
case
INDEX_op_shr_i64
:
case
INDEX_op_sar_i64
:
case
INDEX_op_rotr_i64
:
case
INDEX_op_rotl_i64
:
return
&
r_r_ri
;
case
INDEX_op_clz_i32
:
case
INDEX_op_clz_i64
:
return
&
r_r_rWZ
;
static
const
TCGTargetOpDef
*
tcg_target_op_def
(
TCGOpcode
op
)
{
int
i
,
n
=
ARRAY_SIZE
(
mips_op_defs
);
case
INDEX_op_deposit_i32
:
case
INDEX_op_deposit_i64
:
return
&
dep
;
case
INDEX_op_brcond_i32
:
case
INDEX_op_brcond_i64
:
return
&
rZ_rZ
;
case
INDEX_op_movcond_i32
:
case
INDEX_op_movcond_i64
:
return
use_mips32r6_instructions
?
&
movc_r6
:
&
movc
;
for
(
i
=
0
;
i
<
n
;
++
i
)
{
if
(
mips_op_defs
[
i
].
op
==
op
)
{
return
&
mips_op_defs
[
i
];
}
case
INDEX_op_add2_i32
:
case
INDEX_op_sub2_i32
:
return
&
add2
;
case
INDEX_op_setcond2_i32
:
return
&
setc2
;
case
INDEX_op_brcond2_i32
:
return
&
br2
;
case
INDEX_op_qemu_ld_i32
:
return
(
TCG_TARGET_REG_BITS
==
64
||
TARGET_LONG_BITS
==
32
?
&
r_L
:
&
r_L_L
);
case
INDEX_op_qemu_st_i32
:
return
(
TCG_TARGET_REG_BITS
==
64
||
TARGET_LONG_BITS
==
32
?
&
SZ_S
:
&
SZ_S_S
);
case
INDEX_op_qemu_ld_i64
:
return
(
TCG_TARGET_REG_BITS
==
64
?
&
r_L
:
TARGET_LONG_BITS
==
32
?
&
r_r_L
:
&
r_r_L_L
);
case
INDEX_op_qemu_st_i64
:
return
(
TCG_TARGET_REG_BITS
==
64
?
&
SZ_S
:
TARGET_LONG_BITS
==
32
?
&
SZ_SZ_S
:
&
SZ_SZ_S_S
);
default:
return
NULL
;
}
return
NULL
;
}
static
int
tcg_target_callee_save_regs
[]
=
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment