EXTS, CINS, and POP route their destination writes through
gen_store_gpr(), which already discards writes to $zero. Remove the
remaining translator fast paths for destination $zero so these Octeon
instructions follow the same shape as BADDU/DMUL and the generic MIPS
translator helpers.
Add a mips64/mips64el linux-user TCG smoke test for representative
Octeon population count instruction paths.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <
20260520172313.23777-8-philmd@linaro.org>
{
TCGv_i64 t0;
- if (a->rt == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
tcg_gen_sextract_i64(t0, t0, a->p, a->lenm1 + 1);
{
TCGv_i64 t0;
- if (a->rt == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
tcg_gen_deposit_z_i64(t0, t0, a->p, a->lenm1 + 1);
{
TCGv_i64 t0;
- if (a->rd == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
if (!a->dw) {
return rd;
}
+static uint64_t octeon_dpop(uint64_t rs)
+{
+ uint64_t rd;
+
+ asm volatile(
+ "move $8, %[rs]\n\t"
+ ".word 0x7100502d\n\t" /* dpop $10, $8 */
+ "move %[rd], $10\n\t"
+ : [rd] "=r" (rd)
+ : [rs] "r" (rs)
+ : "$8", "$10");
+
+ return rd;
+}
+
int main(void)
{
assert(octeon_baddu(0x123, 0x0f0) == 0x13);
assert(octeon_dmul(0x12345678, 0x10) == 0x123456780);
+ assert(octeon_dpop(0xf0f0f0f0f0f0f0f0ULL) == 32);
return 0;
}