target-sparc: Implement PDIST.
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
445167723d
commit
f888300b81
@ -137,6 +137,7 @@ DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
|
||||
DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
|
||||
DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
|
||||
DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
|
||||
DEF_HELPER_FLAGS_3(pdist, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
|
||||
#define VIS_HELPER(name) \
|
||||
DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_CONST | TCG_CALL_PURE, \
|
||||
i64, i64, i64) \
|
||||
|
@ -1738,6 +1738,21 @@ static inline void gen_ne_fop_DDD(DisasContext *dc, int rd, int rs1, int rs2,
|
||||
|
||||
gen_store_fpr_D(dc, rd, dst);
|
||||
}
|
||||
|
||||
static inline void gen_ne_fop_DDDD(DisasContext *dc, int rd, int rs1, int rs2,
|
||||
void (*gen)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64))
|
||||
{
|
||||
TCGv_i64 dst, src0, src1, src2;
|
||||
|
||||
src1 = gen_load_fpr_D(dc, rs1);
|
||||
src2 = gen_load_fpr_D(dc, rs2);
|
||||
src0 = gen_load_fpr_D(dc, rd);
|
||||
dst = gen_dest_fpr_D();
|
||||
|
||||
gen(dst, src0, src1, src2);
|
||||
|
||||
gen_store_fpr_D(dc, rd, dst);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void gen_fop_QQ(DisasContext *dc, int rd, int rs,
|
||||
@ -4059,9 +4074,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
case 0x03a: /* VIS I fpack32 */
|
||||
case 0x03b: /* VIS I fpack16 */
|
||||
case 0x03d: /* VIS I fpackfix */
|
||||
case 0x03e: /* VIS I pdist */
|
||||
// XXX
|
||||
goto illegal_insn;
|
||||
case 0x03e: /* VIS I pdist */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
gen_ne_fop_DDDD(dc, rd, rs1, rs2, gen_helper_pdist);
|
||||
break;
|
||||
case 0x048: /* VIS I faligndata */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
|
@ -396,3 +396,24 @@ VIS_CMPHELPER(helper_fcmpgt, FCMPGT)
|
||||
VIS_CMPHELPER(helper_fcmpeq, FCMPEQ)
|
||||
VIS_CMPHELPER(helper_fcmple, FCMPLE)
|
||||
VIS_CMPHELPER(helper_fcmpne, FCMPNE)
|
||||
|
||||
uint64_t helper_pdist(uint64_t sum, uint64_t src1, uint64_t src2)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
int s1, s2;
|
||||
|
||||
s1 = (src1 >> (56 - (i * 8))) & 0xff;
|
||||
s2 = (src2 >> (56 - (i * 8))) & 0xff;
|
||||
|
||||
/* Absolute value of difference. */
|
||||
s1 -= s2;
|
||||
if (s1 < 0) {
|
||||
s1 = -s1;
|
||||
}
|
||||
|
||||
sum += s1;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user