Commit da1a4cef authored by Petar Jovanovic's avatar Petar Jovanovic Committed by Aurelien Jarno
Browse files

target-mips: Fix helper and tests for dot/cross-dot product instructions



Helper function for dpa_w_ph, dpax_w_ph, dps_w_ph and dpsx_w_ph incorrectly
defines halfword vector elements as unsigned values. This results in wrong
output which is not triggered in the tests as they also follow this logic.

Signed-off-by: default avatarPetar Jovanovic <petarj@mips.com>
Reviewed-by: default avatarEric Johnson <ericj@mips.com>
Signed-off-by: default avatarAurelien Jarno <aurelien@aurel32.net>
parent e320d05a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2473,7 +2473,7 @@ DP_OB(dpsu_h_obr, 0, 24, 16, 8, 0, 24, 16, 8, 0);
void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt,              \
                   CPUMIPSState *env)                                          \
{                                                                              \
    uint16_t rsB, rsA, rtB, rtA;                                               \
    int16_t rsB, rsA, rtB, rtA;                                                \
    int32_t  tempA, tempB;                                                     \
    int64_t  acc;                                                              \
                                                                               \
+2 −2
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@ int main()
    ach = 6, acl = 7;
    rs     = 0xFFFF00FF;
    rt     = 0xFFFF0002;
    resulth = 0x05;
    resultl = 0xfffe0206;
    resulth = 0x06;
    resultl = 0x206;
    __asm
        ("mthi  %0, $ac1\n\t"
         "mtlo  %1, $ac1\n\t"
+17 −0
Original line number Diff line number Diff line
@@ -23,5 +23,22 @@ int main()
    assert(ach == resulth);
    assert(acl == resultl);

    ach = 6, acl = 7;
    rs     = 0xFFFF00FF;
    rt     = 0xFFFF0002;
    resulth = 0x05;
    resultl = 0xFFFFFF06;
    __asm
        ("mthi  %0, $ac1\n\t"
         "mtlo  %1, $ac1\n\t"
         "dpax.w.ph $ac1, %2, %3\n\t"
         "mfhi  %0, $ac1\n\t"
         "mflo  %1, $ac1\n\t"
         : "+r"(ach), "+r"(acl)
         : "r"(rs), "r"(rt)
        );
    assert(ach == resulth);
    assert(acl == resultl);

    return 0;
}
+17 −0
Original line number Diff line number Diff line
@@ -23,5 +23,22 @@ int main()
    assert(ach == resulth);
    assert(acl == resultl);

    ach = 6, acl = 7;
    rs     = 0xFFFF00FF;
    rt     = 0xFFFF0002;
    resulth = 0x05;
    resultl = 0xFFFFFE08;
    __asm
        ("mthi  %0, $ac1\n\t"
         "mtlo  %1, $ac1\n\t"
         "dps.w.ph $ac1, %2, %3\n\t"
         "mfhi  %0, $ac1\n\t"
         "mflo  %1, $ac1\n\t"
         : "+r"(ach), "+r"(acl)
         : "r"(rs), "r"(rt)
        );
    assert(ach == resulth);
    assert(acl == resultl);

    return 0;
}
+2 −2
Original line number Diff line number Diff line
@@ -9,8 +9,8 @@ int main()

    rs      = 0xBC0123AD;
    rt      = 0x01643721;
    resulth = 0x04;
    resultl = 0xD751F050;
    resulth = 0x05;
    resultl = 0xE72F050;
    __asm
        ("mthi  %0, $ac1\n\t"
         "mtlo  %1, $ac1\n\t"