Merge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-feb-14-2019' into staging

MIPS queue for February 14th, 2019

# gpg: Signature made Thu 14 Feb 2019 16:48:39 GMT
# gpg:                using RSA key D4972A8967F75A65
# gpg: Good signature from "Aleksandar Markovic <amarkovic@wavecomp.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 8526 FBF1 5DA3 811F 4A01  DD75 D497 2A89 67F7 5A65

* remotes/amarkovic/tags/mips-queue-feb-14-2019:
  tests/tcg: target/mips: Add tests for MSA logic instructions
  tests/tcg: target/mips: Add wrappers for MSA logic instructions
  tests/tcg: target/mips: Add tests for MSA interleave instructions
  tests/tcg: target/mips: Add wrappers for MSA interleave instructions
  tests/tcg: target/mips: Add tests for MSA bit counting instructions
  tests/tcg: target/mips: Add wrappers for MSA bit counting instructions
  tests/tcg: target/mips: Add a header with test utilities
  tests/tcg: target/mips: Add a header with test inputs
  tests/tcg: target/mips: Remove an unnecessary file
  target/mips: introduce MTTCG-enabled builds
  hw/mips_cpc: kick a VP when putting it into Run statewq
  target/mips: hold BQL in mips_vpe_wake()
  hw/mips_int: hold BQL for all interrupt requests
  target/mips: reimplement SC instruction emulation and use cmpxchg
  target/mips: compare virtual addresses in LL/SC sequence

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell
2019-02-14 18:33:00 +00:00
46 changed files with 5194 additions and 229 deletions
Vendored
+3
View File
@@ -7203,11 +7203,13 @@ case "$target_name" in
target_compiler=$cross_cc_microblaze
;;
mips|mipsel)
mttcg="yes"
TARGET_ARCH=mips
target_compiler=$cross_cc_mips
echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
;;
mipsn32|mipsn32el)
mttcg="yes"
TARGET_ARCH=mips64
TARGET_BASE_ARCH=mips
target_compiler=$cross_cc_mipsn32
@@ -7215,6 +7217,7 @@ case "$target_name" in
echo "TARGET_ABI32=y" >> $config_target_mak
;;
mips64|mips64el)
mttcg="yes"
TARGET_ARCH=mips64
TARGET_BASE_ARCH=mips
target_compiler=$cross_cc_mips64
+12
View File
@@ -21,6 +21,7 @@
*/
#include "qemu/osdep.h"
#include "qemu/main-loop.h"
#include "hw/hw.h"
#include "hw/mips/cpudevs.h"
#include "cpu.h"
@@ -32,10 +33,17 @@ static void cpu_mips_irq_request(void *opaque, int irq, int level)
MIPSCPU *cpu = opaque;
CPUMIPSState *env = &cpu->env;
CPUState *cs = CPU(cpu);
bool locked = false;
if (irq < 0 || irq > 7)
return;
/* Make sure locking works even if BQL is already held by the caller */
if (!qemu_mutex_iothread_locked()) {
locked = true;
qemu_mutex_lock_iothread();
}
if (level) {
env->CP0_Cause |= 1 << (irq + CP0Ca_IP);
@@ -56,6 +64,10 @@ static void cpu_mips_irq_request(void *opaque, int irq, int level)
} else {
cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
}
if (locked) {
qemu_mutex_unlock_iothread();
}
}
void cpu_mips_irq_init_cpu(MIPSCPU *cpu)
+15 -2
View File
@@ -30,6 +30,14 @@ static inline uint64_t cpc_vp_run_mask(MIPSCPCState *cpc)
return (1ULL << cpc->num_vp) - 1;
}
static void mips_cpu_reset_async_work(CPUState *cs, run_on_cpu_data data)
{
MIPSCPCState *cpc = (MIPSCPCState *) data.host_ptr;
cpu_reset(cs);
cpc->vp_running |= 1ULL << cs->cpu_index;
}
static void cpc_run_vp(MIPSCPCState *cpc, uint64_t vp_run)
{
CPUState *cs = first_cpu;
@@ -37,8 +45,13 @@ static void cpc_run_vp(MIPSCPCState *cpc, uint64_t vp_run)
CPU_FOREACH(cs) {
uint64_t i = 1ULL << cs->cpu_index;
if (i & vp_run & ~cpc->vp_running) {
cpu_reset(cs);
cpc->vp_running |= i;
/*
* To avoid racing with a CPU we are just kicking off.
* We do the final bit of preparation for the work in
* the target CPUs context.
*/
async_safe_run_on_cpu(cs, mips_cpu_reset_async_work,
RUN_ON_CPU_HOST_PTR(cpc));
}
}
}
-73
View File
@@ -392,70 +392,6 @@ static const uint8_t mips_syscall_args[] = {
# undef MIPS_SYS
# endif /* O32 */
static int do_store_exclusive(CPUMIPSState *env)
{
target_ulong addr;
target_ulong page_addr;
target_ulong val;
uint32_t val_wp = 0;
uint32_t llnewval_wp = 0;
int flags;
int segv = 0;
int reg;
int d;
int wp;
addr = env->lladdr;
page_addr = addr & TARGET_PAGE_MASK;
start_exclusive();
mmap_lock();
flags = page_get_flags(page_addr);
if ((flags & PAGE_READ) == 0) {
segv = 1;
} else {
reg = env->llreg & 0x1f;
d = (env->llreg & 0x20) != 0;
wp = (env->llreg & 0x40) != 0;
if (!wp) {
if (d) {
segv = get_user_s64(val, addr);
} else {
segv = get_user_s32(val, addr);
}
} else {
segv = get_user_s32(val, addr);
segv |= get_user_s32(val_wp, addr);
llnewval_wp = env->llnewval_wp;
}
if (!segv) {
if (val != env->llval && val_wp == llnewval_wp) {
env->active_tc.gpr[reg] = 0;
} else {
if (!wp) {
if (d) {
segv = put_user_u64(env->llnewval, addr);
} else {
segv = put_user_u32(env->llnewval, addr);
}
} else {
segv = put_user_u32(env->llnewval, addr);
segv |= put_user_u32(env->llnewval_wp, addr + 4);
}
if (!segv) {
env->active_tc.gpr[reg] = 1;
}
}
}
}
env->lladdr = -1;
if (!segv) {
env->active_tc.PC += 4;
}
mmap_unlock();
end_exclusive();
return segv;
}
/* Break codes */
enum {
BRK_OVERFLOW = 6,
@@ -597,15 +533,6 @@ done_syscall:
info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break;
case EXCP_SC:
if (do_store_exclusive(env)) {
info.si_signo = TARGET_SIGSEGV;
info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->active_tc.PC;
queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
}
break;
case EXCP_DSPDIS:
info.si_signo = TARGET_SIGILL;
info.si_errno = 0;
+4 -5
View File
@@ -11,6 +11,8 @@
#include "exec/cpu-defs.h"
#include "fpu/softfloat.h"
#define TCG_GUEST_DEFAULT_MO (0)
struct CPUMIPSState;
typedef struct CPUMIPSTLBContext CPUMIPSTLBContext;
@@ -867,18 +869,17 @@ struct CPUMIPSState {
#define CP0C5_NFExists 0
int32_t CP0_Config6;
int32_t CP0_Config7;
uint64_t CP0_LLAddr;
uint64_t CP0_MAAR[MIPS_MAAR_MAX];
int32_t CP0_MAARI;
/* XXX: Maybe make LLAddr per-TC? */
/*
* CP0 Register 17
*/
uint64_t lladdr;
target_ulong lladdr; /* LL virtual address compared against SC */
target_ulong llval;
target_ulong llnewval;
uint64_t llval_wp;
uint32_t llnewval_wp;
target_ulong llreg;
uint64_t CP0_LLAddr_rw_bitmask;
int CP0_LLAddr_shift;
/*
@@ -1155,8 +1156,6 @@ enum {
EXCP_LAST = EXCP_TLBRI,
};
/* Dummy exception for conditional stores. */
#define EXCP_SC 0x100
/*
* This is an internally generated WAKE request line.
+2 -4
View File
@@ -1463,10 +1463,8 @@ void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env,
{
CPUState *cs = CPU(mips_env_get_cpu(env));
if (exception < EXCP_SC) {
qemu_log_mask(CPU_LOG_INT, "%s: %d %d\n",
__func__, exception, error_code);
}
qemu_log_mask(CPU_LOG_INT, "%s: %d %d\n",
__func__, exception, error_code);
cs->exception_index = exception;
env->error_code = error_code;
-2
View File
@@ -13,10 +13,8 @@ DEF_HELPER_4(swr, void, env, tl, tl, int)
#ifndef CONFIG_USER_ONLY
DEF_HELPER_3(ll, tl, env, tl, int)
DEF_HELPER_4(sc, tl, env, tl, tl, int)
#ifdef TARGET_MIPS64
DEF_HELPER_3(lld, tl, env, tl, int)
DEF_HELPER_4(scd, tl, env, tl, tl, int)
#endif
#endif
+4 -3
View File
@@ -214,8 +214,8 @@ const VMStateDescription vmstate_tlb = {
const VMStateDescription vmstate_mips_cpu = {
.name = "cpu",
.version_id = 17,
.minimum_version_id = 17,
.version_id = 18,
.minimum_version_id = 18,
.post_load = cpu_post_load,
.fields = (VMStateField[]) {
/* Active TC */
@@ -293,9 +293,10 @@ const VMStateDescription vmstate_mips_cpu = {
VMSTATE_INT32(env.CP0_Config3, MIPSCPU),
VMSTATE_INT32(env.CP0_Config6, MIPSCPU),
VMSTATE_INT32(env.CP0_Config7, MIPSCPU),
VMSTATE_UINT64(env.CP0_LLAddr, MIPSCPU),
VMSTATE_UINT64_ARRAY(env.CP0_MAAR, MIPSCPU, MIPS_MAAR_MAX),
VMSTATE_INT32(env.CP0_MAARI, MIPSCPU),
VMSTATE_UINT64(env.lladdr, MIPSCPU),
VMSTATE_UINTTL(env.lladdr, MIPSCPU),
VMSTATE_UINTTL_ARRAY(env.CP0_WatchLo, MIPSCPU, 8),
VMSTATE_INT32_ARRAY(env.CP0_WatchHi, MIPSCPU, 8),
VMSTATE_UINTTL(env.CP0_XContext, MIPSCPU),
+21 -55
View File
@@ -349,15 +349,15 @@ static inline hwaddr do_translate_address(CPUMIPSState *env,
target_ulong address,
int rw, uintptr_t retaddr)
{
hwaddr lladdr;
hwaddr paddr;
CPUState *cs = CPU(mips_env_get_cpu(env));
lladdr = cpu_mips_translate_address(env, address, rw);
paddr = cpu_mips_translate_address(env, address, rw);
if (lladdr == -1LL) {
if (paddr == -1LL) {
cpu_loop_exit_restore(cs, retaddr);
} else {
return lladdr;
return paddr;
}
}
@@ -370,7 +370,8 @@ target_ulong helper_##name(CPUMIPSState *env, target_ulong arg, int mem_idx) \
} \
do_raise_exception(env, EXCP_AdEL, GETPC()); \
} \
env->lladdr = do_translate_address(env, arg, 0, GETPC()); \
env->CP0_LLAddr = do_translate_address(env, arg, 0, GETPC()); \
env->lladdr = arg; \
env->llval = do_##insn(env, arg, mem_idx, GETPC()); \
return env->llval; \
}
@@ -379,33 +380,6 @@ HELPER_LD_ATOMIC(ll, lw, 0x3)
HELPER_LD_ATOMIC(lld, ld, 0x7)
#endif
#undef HELPER_LD_ATOMIC
#define HELPER_ST_ATOMIC(name, ld_insn, st_insn, almask) \
target_ulong helper_##name(CPUMIPSState *env, target_ulong arg1, \
target_ulong arg2, int mem_idx) \
{ \
target_long tmp; \
\
if (arg2 & almask) { \
if (!(env->hflags & MIPS_HFLAG_DM)) { \
env->CP0_BadVAddr = arg2; \
} \
do_raise_exception(env, EXCP_AdES, GETPC()); \
} \
if (do_translate_address(env, arg2, 1, GETPC()) == env->lladdr) { \
tmp = do_##ld_insn(env, arg2, mem_idx, GETPC()); \
if (tmp == env->llval) { \
do_##st_insn(env, arg2, arg1, mem_idx, GETPC()); \
return 1; \
} \
} \
return 0; \
}
HELPER_ST_ATOMIC(sc, lw, sw, 0x3)
#ifdef TARGET_MIPS64
HELPER_ST_ATOMIC(scd, ld, sd, 0x7)
#endif
#undef HELPER_ST_ATOMIC
#endif
#ifdef TARGET_WORDS_BIGENDIAN
@@ -665,7 +639,9 @@ static inline void mips_vpe_wake(MIPSCPU *c)
/* Don't set ->halted = 0 directly, let it be done via cpu_has_work
because there might be other conditions that state that c should
be sleeping. */
qemu_mutex_lock_iothread();
cpu_interrupt(CPU(c), CPU_INTERRUPT_WAKE);
qemu_mutex_unlock_iothread();
}
static inline void mips_vpe_sleep(MIPSCPU *cpu)
@@ -931,11 +907,7 @@ target_ulong helper_mftc0_tcschefback(CPUMIPSState *env)
target_ulong helper_mfc0_count(CPUMIPSState *env)
{
int32_t count;
qemu_mutex_lock_iothread();
count = (int32_t) cpu_mips_get_count(env);
qemu_mutex_unlock_iothread();
return count;
return (int32_t)cpu_mips_get_count(env);
}
target_ulong helper_mfc0_saar(CPUMIPSState *env)
@@ -987,7 +959,7 @@ target_ulong helper_mftc0_status(CPUMIPSState *env)
target_ulong helper_mfc0_lladdr(CPUMIPSState *env)
{
return (int32_t)(env->lladdr >> env->CP0_LLAddr_shift);
return (int32_t)(env->CP0_LLAddr >> env->CP0_LLAddr_shift);
}
target_ulong helper_mfc0_maar(CPUMIPSState *env)
@@ -1063,7 +1035,7 @@ target_ulong helper_dmfc0_tcschefback(CPUMIPSState *env)
target_ulong helper_dmfc0_lladdr(CPUMIPSState *env)
{
return env->lladdr >> env->CP0_LLAddr_shift;
return env->CP0_LLAddr >> env->CP0_LLAddr_shift;
}
target_ulong helper_dmfc0_maar(CPUMIPSState *env)
@@ -1299,7 +1271,8 @@ void helper_mtc0_tcrestart(CPUMIPSState *env, target_ulong arg1)
{
env->active_tc.PC = arg1;
env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
env->lladdr = 0ULL;
env->CP0_LLAddr = 0;
env->lladdr = 0;
/* MIPS16 not implemented. */
}
@@ -1311,12 +1284,14 @@ void helper_mttc0_tcrestart(CPUMIPSState *env, target_ulong arg1)
if (other_tc == other->current_tc) {
other->active_tc.PC = arg1;
other->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
other->lladdr = 0ULL;
other->CP0_LLAddr = 0;
other->lladdr = 0;
/* MIPS16 not implemented. */
} else {
other->tcs[other_tc].PC = arg1;
other->tcs[other_tc].CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
other->lladdr = 0ULL;
other->CP0_LLAddr = 0;
other->lladdr = 0;
/* MIPS16 not implemented. */
}
}
@@ -1617,9 +1592,7 @@ void helper_mtc0_hwrena(CPUMIPSState *env, target_ulong arg1)
void helper_mtc0_count(CPUMIPSState *env, target_ulong arg1)
{
qemu_mutex_lock_iothread();
cpu_mips_store_count(env, arg1);
qemu_mutex_unlock_iothread();
}
void helper_mtc0_saari(CPUMIPSState *env, target_ulong arg1)
@@ -1708,9 +1681,7 @@ void helper_mttc0_entryhi(CPUMIPSState *env, target_ulong arg1)
void helper_mtc0_compare(CPUMIPSState *env, target_ulong arg1)
{
qemu_mutex_lock_iothread();
cpu_mips_store_compare(env, arg1);
qemu_mutex_unlock_iothread();
}
void helper_mtc0_status(CPUMIPSState *env, target_ulong arg1)
@@ -1764,9 +1735,7 @@ void helper_mtc0_srsctl(CPUMIPSState *env, target_ulong arg1)
void helper_mtc0_cause(CPUMIPSState *env, target_ulong arg1)
{
qemu_mutex_lock_iothread();
cpu_mips_store_cause(env, arg1);
qemu_mutex_unlock_iothread();
}
void helper_mttc0_cause(CPUMIPSState *env, target_ulong arg1)
@@ -1868,7 +1837,7 @@ void helper_mtc0_lladdr(CPUMIPSState *env, target_ulong arg1)
{
target_long mask = env->CP0_LLAddr_rw_bitmask;
arg1 = arg1 << env->CP0_LLAddr_shift;
env->lladdr = (env->lladdr & ~mask) | (arg1 & mask);
env->CP0_LLAddr = (env->CP0_LLAddr & ~mask) | (arg1 & mask);
}
#define MTC0_MAAR_MASK(env) \
@@ -2566,6 +2535,7 @@ static inline void exception_return(CPUMIPSState *env)
void helper_eret(CPUMIPSState *env)
{
exception_return(env);
env->CP0_LLAddr = 1;
env->lladdr = 1;
}
@@ -2609,16 +2579,12 @@ target_ulong helper_rdhwr_synci_step(CPUMIPSState *env)
target_ulong helper_rdhwr_cc(CPUMIPSState *env)
{
int32_t count;
check_hwrena(env, 2, GETPC());
#ifdef CONFIG_USER_ONLY
count = env->CP0_Count;
return env->CP0_Count;
#else
qemu_mutex_lock_iothread();
count = (int32_t)cpu_mips_get_count(env);
qemu_mutex_unlock_iothread();
return (int32_t)cpu_mips_get_count(env);
#endif
return count;
}
target_ulong helper_rdhwr_ccres(CPUMIPSState *env)
+44 -83
View File
@@ -2450,6 +2450,7 @@ enum {
static TCGv cpu_gpr[32], cpu_PC;
static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
static TCGv cpu_dspctrl, btarget, bcond;
static TCGv cpu_lladdr, cpu_llval;
static TCGv_i32 hflags;
static TCGv_i32 fpu_fcr0, fpu_fcr31;
static TCGv_i64 fpu_f64[32];
@@ -3326,48 +3327,6 @@ OP_LD_ATOMIC(lld,ld64);
#endif
#undef OP_LD_ATOMIC
#ifdef CONFIG_USER_ONLY
#define OP_ST_ATOMIC(insn,fname,ldname,almask) \
static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx, \
DisasContext *ctx) \
{ \
TCGv t0 = tcg_temp_new(); \
TCGLabel *l1 = gen_new_label(); \
TCGLabel *l2 = gen_new_label(); \
\
tcg_gen_andi_tl(t0, arg2, almask); \
tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1); \
tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr)); \
generate_exception(ctx, EXCP_AdES); \
gen_set_label(l1); \
tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr)); \
tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2); \
tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20)); \
tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg)); \
tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval)); \
generate_exception_end(ctx, EXCP_SC); \
gen_set_label(l2); \
tcg_gen_movi_tl(t0, 0); \
gen_store_gpr(t0, rt); \
tcg_temp_free(t0); \
}
#else
#define OP_ST_ATOMIC(insn,fname,ldname,almask) \
static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx, \
DisasContext *ctx) \
{ \
TCGv t0 = tcg_temp_new(); \
gen_helper_1e2i(insn, t0, arg1, arg2, mem_idx); \
gen_store_gpr(t0, rt); \
tcg_temp_free(t0); \
}
#endif
OP_ST_ATOMIC(sc,st32,ld32s,0x3);
#if defined(TARGET_MIPS64)
OP_ST_ATOMIC(scd,st64,ld64,0x7);
#endif
#undef OP_ST_ATOMIC
static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
int base, int offset)
{
@@ -3679,40 +3638,38 @@ static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
/* Store conditional */
static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
int base, int16_t offset)
static void gen_st_cond(DisasContext *ctx, int rt, int base, int offset,
TCGMemOp tcg_mo, bool eva)
{
TCGv t0, t1;
int mem_idx = ctx->mem_idx;
TCGv addr, t0, val;
TCGLabel *l1 = gen_new_label();
TCGLabel *done = gen_new_label();
#ifdef CONFIG_USER_ONLY
t0 = tcg_temp_local_new();
t1 = tcg_temp_local_new();
#else
t0 = tcg_temp_new();
t1 = tcg_temp_new();
#endif
gen_base_offset_addr(ctx, t0, base, offset);
gen_load_gpr(t1, rt);
switch (opc) {
#if defined(TARGET_MIPS64)
case OPC_SCD:
case R6_OPC_SCD:
op_st_scd(t1, t0, rt, mem_idx, ctx);
break;
#endif
case OPC_SCE:
mem_idx = MIPS_HFLAG_UM;
/* fall through */
case OPC_SC:
case R6_OPC_SC:
op_st_sc(t1, t0, rt, mem_idx, ctx);
break;
}
tcg_temp_free(t1);
addr = tcg_temp_new();
/* compare the address against that of the preceeding LL */
gen_base_offset_addr(ctx, addr, base, offset);
tcg_gen_brcond_tl(TCG_COND_EQ, addr, cpu_lladdr, l1);
tcg_temp_free(addr);
tcg_gen_movi_tl(t0, 0);
gen_store_gpr(t0, rt);
tcg_gen_br(done);
gen_set_label(l1);
/* generate cmpxchg */
val = tcg_temp_new();
gen_load_gpr(val, rt);
tcg_gen_atomic_cmpxchg_tl(t0, cpu_lladdr, cpu_llval, val,
eva ? MIPS_HFLAG_UM : ctx->mem_idx, tcg_mo);
tcg_gen_setcond_tl(TCG_COND_EQ, t0, t0, cpu_llval);
gen_store_gpr(t0, rt);
tcg_temp_free(val);
gen_set_label(done);
tcg_temp_free(t0);
}
static void gen_scwp(DisasContext *ctx, uint32_t base, int16_t offset,
uint32_t reg1, uint32_t reg2, bool eva)
{
@@ -6612,7 +6569,7 @@ static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
case CP0_REGISTER_17:
switch (sel) {
case 0:
gen_mfhc0_load64(arg, offsetof(CPUMIPSState, lladdr),
gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_LLAddr),
ctx->CP0_LLAddr_shift);
register_name = "LLAddr";
break;
@@ -16864,13 +16821,13 @@ static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
gen_st(ctx, mips32_op, rt, rs, offset);
break;
case SC:
gen_st_cond(ctx, OPC_SC, rt, rs, offset);
gen_st_cond(ctx, rt, rs, offset, MO_TESL, false);
break;
#if defined(TARGET_MIPS64)
case SCD:
check_insn(ctx, ISA_MIPS3);
check_mips_64(ctx);
gen_st_cond(ctx, OPC_SCD, rt, rs, offset);
gen_st_cond(ctx, rt, rs, offset, MO_TEQ, false);
break;
#endif
case LD_EVA:
@@ -16951,7 +16908,7 @@ static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
mips32_op = OPC_SHE;
goto do_st_lr;
case SCE:
gen_st_cond(ctx, OPC_SCE, rt, rs, offset);
gen_st_cond(ctx, rt, rs, offset, MO_TESL, true);
break;
case SWE:
mips32_op = OPC_SWE;
@@ -21558,7 +21515,7 @@ static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
case NM_P_SC:
switch (ctx->opcode & 0x03) {
case NM_SC:
gen_st_cond(ctx, OPC_SC, rt, rs, s);
gen_st_cond(ctx, rt, rs, s, MO_TESL, false);
break;
case NM_SCWP:
check_xnp(ctx);
@@ -21661,7 +21618,7 @@ static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
check_xnp(ctx);
check_eva(ctx);
check_cp0_enabled(ctx);
gen_st_cond(ctx, OPC_SCE, rt, rs, s);
gen_st_cond(ctx, rt, rs, s, MO_TESL, true);
break;
case NM_SCWPE:
check_xnp(ctx);
@@ -26698,7 +26655,7 @@ static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
}
break;
case R6_OPC_SC:
gen_st_cond(ctx, op1, rt, rs, imm);
gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
break;
case R6_OPC_LL:
gen_ld(ctx, op1, rt, rs, imm);
@@ -26725,7 +26682,7 @@ static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
break;
#if defined(TARGET_MIPS64)
case R6_OPC_SCD:
gen_st_cond(ctx, op1, rt, rs, imm);
gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
break;
case R6_OPC_LLD:
gen_ld(ctx, op1, rt, rs, imm);
@@ -27580,7 +27537,7 @@ static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
return;
case OPC_SCE:
check_cp0_enabled(ctx);
gen_st_cond(ctx, op1, rt, rs, imm);
gen_st_cond(ctx, rt, rs, imm, MO_TESL, true);
return;
case OPC_CACHEE:
check_cp0_enabled(ctx);
@@ -29172,8 +29129,8 @@ static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
if (ctx->insn_flags & INSN_R5900) {
check_insn_opc_user_only(ctx, INSN_R5900);
}
gen_st_cond(ctx, op, rt, rs, imm);
break;
gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
break;
case OPC_CACHE:
check_insn_opc_removed(ctx, ISA_MIPS32R6);
check_cp0_enabled(ctx);
@@ -29472,7 +29429,7 @@ static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
check_insn_opc_user_only(ctx, INSN_R5900);
}
check_mips_64(ctx);
gen_st_cond(ctx, op, rt, rs, imm);
gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
break;
case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
if (ctx->insn_flags & ISA_MIPS32R6) {
@@ -29795,7 +29752,7 @@ void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
cpu_fprintf(f, " Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
PRIx64 "\n",
env->CP0_Config0, env->CP0_Config1, env->lladdr);
env->CP0_Config0, env->CP0_Config1, env->CP0_LLAddr);
cpu_fprintf(f, " Config2 0x%08x Config3 0x%08x\n",
env->CP0_Config2, env->CP0_Config3);
cpu_fprintf(f, " Config4 0x%08x Config5 0x%08x\n",
@@ -29853,6 +29810,10 @@ void mips_tcg_init(void)
fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
offsetof(CPUMIPSState, active_fpu.fcr31),
"fcr31");
cpu_lladdr = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, lladdr),
"lladdr");
cpu_llval = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, llval),
"llval");
#if defined(TARGET_MIPS64)
cpu_mmr[0] = NULL;
+122
View File
@@ -0,0 +1,122 @@
/*
* Header file for pattern and random test inputs
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef TEST_INPUTS_H
#define TEST_INPUTS_H
#include <stdint.h>
#define PATTERN_INPUTS_COUNT 64
#define PATTERN_INPUTS_SHORT_COUNT 8
uint64_t b128_pattern[PATTERN_INPUTS_COUNT][2] = {
{ 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, }, /* 0 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0xAAAAAAAAAAAAAAAAULL, 0xAAAAAAAAAAAAAAAAULL, },
{ 0x5555555555555555ULL, 0x5555555555555555ULL, },
{ 0xCCCCCCCCCCCCCCCCULL, 0xCCCCCCCCCCCCCCCCULL, },
{ 0x3333333333333333ULL, 0x3333333333333333ULL, },
{ 0xE38E38E38E38E38EULL, 0x38E38E38E38E38E3ULL, },
{ 0x1C71C71C71C71C71ULL, 0xC71C71C71C71C71CULL, },
{ 0xF0F0F0F0F0F0F0F0ULL, 0xF0F0F0F0F0F0F0F0ULL, }, /* 8 */
{ 0x0F0F0F0F0F0F0F0FULL, 0x0F0F0F0F0F0F0F0FULL, },
{ 0xF83E0F83E0F83E0FULL, 0x83E0F83E0F83E0F8ULL, },
{ 0x07C1F07C1F07C1F0ULL, 0x7C1F07C1F07C1F07ULL, },
{ 0xFC0FC0FC0FC0FC0FULL, 0xC0FC0FC0FC0FC0FCULL, },
{ 0x03F03F03F03F03F0ULL, 0x3F03F03F03F03F03ULL, },
{ 0xFE03F80FE03F80FEULL, 0x03F80FE03F80FE03ULL, },
{ 0x01FC07F01FC07F01ULL, 0xFC07F01FC07F01FCULL, },
{ 0xFF00FF00FF00FF00ULL, 0xFF00FF00FF00FF00ULL, }, /* 16 */
{ 0x00FF00FF00FF00FFULL, 0x00FF00FF00FF00FFULL, },
{ 0xFF803FE00FF803FEULL, 0x00FF803FE00FF803ULL, },
{ 0x007FC01FF007FC01ULL, 0xFF007FC01FF007FCULL, },
{ 0xFFC00FFC00FFC00FULL, 0xFC00FFC00FFC00FFULL, },
{ 0x003FF003FF003FF0ULL, 0x03FF003FF003FF00ULL, },
{ 0xFFE003FF800FFE00ULL, 0x3FF800FFE003FF80ULL, },
{ 0x001FFC007FF001FFULL, 0xC007FF001FFC007FULL, },
{ 0xFFF000FFF000FFF0ULL, 0x00FFF000FFF000FFULL, }, /* 24 */
{ 0x000FFF000FFF000FULL, 0xFF000FFF000FFF00ULL, },
{ 0xFFF8003FFE000FFFULL, 0x8003FFE000FFF800ULL, },
{ 0x0007FFC001FFF000ULL, 0x7FFC001FFF0007FFULL, },
{ 0xFFFC000FFFC000FFULL, 0xFC000FFFC000FFFCULL, },
{ 0x0003FFF0003FFF00ULL, 0x03FFF0003FFF0003ULL, },
{ 0xFFFE0003FFF8000FULL, 0xFFE0003FFF8000FFULL, },
{ 0x0001FFFC0007FFF0ULL, 0x001FFFC0007FFF00ULL, },
{ 0xFFFF0000FFFF0000ULL, 0xFFFF0000FFFF0000ULL, }, /* 32 */
{ 0x0000FFFF0000FFFFULL, 0x0000FFFF0000FFFFULL, },
{ 0xFFFF80003FFFE000ULL, 0x0FFFF80003FFFE00ULL, },
{ 0x00007FFFC0001FFFULL, 0xF00007FFFC0001FFULL, },
{ 0xFFFFC0000FFFFC00ULL, 0x00FFFFC0000FFFFCULL, },
{ 0x00003FFFF00003FFULL, 0xFF00003FFFF00003ULL, },
{ 0xFFFFE00003FFFF80ULL, 0x000FFFFE00003FFFULL, },
{ 0x00001FFFFC00007FULL, 0xFFF00001FFFFC000ULL, },
{ 0xFFFFF00000FFFFF0ULL, 0x0000FFFFF00000FFULL, }, /* 40 */
{ 0x00000FFFFF00000FULL, 0xFFFF00000FFFFF00ULL, },
{ 0xFFFFF800003FFFFEULL, 0x00000FFFFF800003ULL, },
{ 0x000007FFFFC00001ULL, 0xFFFFF000007FFFFCULL, },
{ 0xFFFFFC00000FFFFFULL, 0xC00000FFFFFC0000ULL, },
{ 0x000003FFFFF00000ULL, 0x3FFFFF000003FFFFULL, },
{ 0xFFFFFE000003FFFFULL, 0xF800000FFFFFE000ULL, },
{ 0x000001FFFFFC0000ULL, 0x07FFFFF000001FFFULL, },
{ 0xFFFFFF000000FFFFULL, 0xFF000000FFFFFF00ULL, }, /* 48 */
{ 0x000000FFFFFF0000ULL, 0x00FFFFFF000000FFULL, },
{ 0xFFFFFF8000003FFFULL, 0xFFE000000FFFFFF8ULL, },
{ 0x0000007FFFFFC000ULL, 0x001FFFFFF0000007ULL, },
{ 0xFFFFFFC000000FFFULL, 0xFFFC000000FFFFFFULL, },
{ 0x0000003FFFFFF000ULL, 0x0003FFFFFF000000ULL, },
{ 0xFFFFFFE0000003FFULL, 0xFFFF8000000FFFFFULL, },
{ 0x0000001FFFFFFC00ULL, 0x00007FFFFFF00000ULL, },
{ 0xFFFFFFF0000000FFULL, 0xFFFFF0000000FFFFULL, }, /* 56 */
{ 0x0000000FFFFFFF00ULL, 0x00000FFFFFFF0000ULL, },
{ 0xFFFFFFF80000003FULL, 0xFFFFFE0000000FFFULL, },
{ 0x00000007FFFFFFC0ULL, 0x000001FFFFFFF000ULL, },
{ 0xFFFFFFFC0000000FULL, 0xFFFFFFC0000000FFULL, },
{ 0x00000003FFFFFFF0ULL, 0x0000003FFFFFFF00ULL, },
{ 0xFFFFFFFE00000003ULL, 0xFFFFFFF80000000FULL, },
{ 0x00000001FFFFFFFCULL, 0x00000007FFFFFFF0ULL, },
};
#define RANDOM_INPUTS_COUNT 16
#define RANDOM_INPUTS_SHORT_COUNT 4
uint64_t b128_random[RANDOM_INPUTS_COUNT][2] = {
{ 0x886AE6CC28625540ULL, 0x4B670B5EFE7BB00CULL, }, /* 0 */
{ 0xFBBE00634D93C708ULL, 0x12F7BB1A153F52FCULL, },
{ 0xAC5AAEAAB9CF8B80ULL, 0x27D8C6FFAB2B2514ULL, },
{ 0x704F164D5E31E24EULL, 0x8DF188D8A942E2A0ULL, },
{ 0xB9926B7C7DAF4258ULL, 0xA1227CADDCCE65B6ULL, },
{ 0xD027BE89FF0A2EF9ULL, 0x170B5050FEA53078ULL, },
{ 0xB83B580665CABC4AULL, 0x91230822BFF0BA62ULL, },
{ 0xFC8F23F09AA6B782ULL, 0x93FD6637124275AEULL, },
{ 0x201E09CD56AEE649ULL, 0xEF5DE039A6A52758ULL, }, /* 8 */
{ 0xA57CD91365D9E5D7ULL, 0x9321BC9881ECBA5CULL, },
{ 0xA2E8F6F5C9CBC61BULL, 0xB2C471545E0D7A12ULL, },
{ 0xA89CF2F131A864AEULL, 0xD2A3E87A5DB986E7ULL, },
{ 0xE61438E9A652EA0AULL, 0xA85483D97879D41CULL, },
{ 0x944A35FD192361A8ULL, 0xF3912DA36A0B2D6BULL, },
{ 0x4630426322BEF79CULL, 0xEB5686F7CB19304EULL, },
{ 0x8B5AA7A2F259DEADULL, 0xD278CBCD696417E3ULL, },
};
#endif
+78
View File
@@ -0,0 +1,78 @@
/*
* Header file for test utilities
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef TEST_UTILS_H
#define TEST_UTILS_H
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#define PRINT_RESULTS 1
static inline int32_t check_results(char *instruction_name,
uint32_t test_count,
double elapsed_time,
uint64_t *b128_result,
uint64_t *b128_expect)
{
#if PRINT_RESULTS
uint32_t ii;
printf("\n");
for (ii = 0; ii < test_count; ii++) {
uint64_t a, b;
memcpy(&a, (b128_result + 2 * ii), 8);
memcpy(&b, (b128_result + 2 * ii + 1), 8);
if (ii % 8 != 0) {
printf(" { 0x%016llxULL, 0x%016llxULL, },\n", a, b);
} else {
printf(" { 0x%016llxULL, 0x%016llxULL, }, /* %3d */\n",
a, b, ii);
}
}
printf("\n");
#endif
uint32_t i;
uint32_t pass_count = 0;
uint32_t fail_count = 0;
printf("%s: ", instruction_name);
for (i = 0; i < test_count; i++) {
if (b128_result[i] == b128_expect[i]) {
pass_count++;
} else {
fail_count++;
}
}
printf("PASS: %3d FAIL: %3d elapsed time: %5.2f ms\n",
pass_count, fail_count, elapsed_time);
if (fail_count > 0) {
return -1;
} else {
return 0;
}
}
#endif
+101
View File
@@ -0,0 +1,101 @@
/*
* Header file for wrappers around MSA instructions assembler invocations
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef WRAPPERS_MSA_H
#define WRAPPERS_MSA_H
#define DO_MSA__WD__WS(suffix, mnemonic) \
static inline void do_msa_##suffix(void *input, void *output) \
{ \
__asm__ volatile ( \
"move $t0, %0\n\t" \
"ld.d $w11, 0($t0)\n\t" \
#mnemonic " $w10, $w11\n\t" \
"move $t0, %1\n\t" \
"st.d $w10, 0($t0)\n\t" \
: \
: "r" (input), "r" (output) \
: "t0", "memory" \
); \
}
DO_MSA__WD__WS(NLOC_B, nloc.b)
DO_MSA__WD__WS(NLOC_H, nloc.h)
DO_MSA__WD__WS(NLOC_W, nloc.w)
DO_MSA__WD__WS(NLOC_D, nloc.d)
DO_MSA__WD__WS(NLZC_B, nlzc.b)
DO_MSA__WD__WS(NLZC_H, nlzc.h)
DO_MSA__WD__WS(NLZC_W, nlzc.w)
DO_MSA__WD__WS(NLZC_D, nlzc.d)
DO_MSA__WD__WS(PCNT_B, pcnt.b)
DO_MSA__WD__WS(PCNT_H, pcnt.h)
DO_MSA__WD__WS(PCNT_W, pcnt.w)
DO_MSA__WD__WS(PCNT_D, pcnt.d)
#define DO_MSA__WD__WS_WT(suffix, mnemonic) \
static inline void do_msa_##suffix(void *input1, void *input2, \
void *output) \
{ \
__asm__ volatile ( \
"move $t0, %0\n\t" \
"ld.d $w11, 0($t0)\n\t" \
"move $t0, %1\n\t" \
"ld.d $w12, 0($t0)\n\t" \
#mnemonic " $w10, $w11, $w12\n\t" \
"move $t0, %2\n\t" \
"st.d $w10, 0($t0)\n\t" \
: \
: "r" (input1), "r" (input2), "r" (output) \
: "t0", "memory" \
); \
}
DO_MSA__WD__WS_WT(ILVEV_B, ilvev.b)
DO_MSA__WD__WS_WT(ILVEV_H, ilvev.h)
DO_MSA__WD__WS_WT(ILVEV_W, ilvev.w)
DO_MSA__WD__WS_WT(ILVEV_D, ilvev.d)
DO_MSA__WD__WS_WT(ILVOD_B, ilvod.b)
DO_MSA__WD__WS_WT(ILVOD_H, ilvod.h)
DO_MSA__WD__WS_WT(ILVOD_W, ilvod.w)
DO_MSA__WD__WS_WT(ILVOD_D, ilvod.d)
DO_MSA__WD__WS_WT(ILVL_B, ilvl.b)
DO_MSA__WD__WS_WT(ILVL_H, ilvl.h)
DO_MSA__WD__WS_WT(ILVL_W, ilvl.w)
DO_MSA__WD__WS_WT(ILVL_D, ilvl.d)
DO_MSA__WD__WS_WT(ILVR_B, ilvr.b)
DO_MSA__WD__WS_WT(ILVR_H, ilvr.h)
DO_MSA__WD__WS_WT(ILVR_W, ilvr.w)
DO_MSA__WD__WS_WT(ILVR_D, ilvr.d)
DO_MSA__WD__WS_WT(AND_V, and.v)
DO_MSA__WD__WS_WT(NOR_V, nor.v)
DO_MSA__WD__WS_WT(OR_V, or.v)
DO_MSA__WD__WS_WT(XOR_V, xor.v)
#endif
-2
View File
@@ -1,2 +0,0 @@
[Dolphin]
Timestamp=2012,8,3,16,41,52
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLOC.B
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLOC.B";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0808080808080808ULL, 0x0808080808080808ULL, }, /* 0 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0101010101010101ULL, 0x0101010101010101ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0202020202020202ULL, 0x0202020202020202ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0301000301000301ULL, 0x0003010003010003ULL, },
{ 0x0000020000020000ULL, 0x0200000200000200ULL, },
{ 0x0404040404040404ULL, 0x0404040404040404ULL, }, /* 8 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0500000103050000ULL, 0x0103050000010305ULL, },
{ 0x0002040000000204ULL, 0x0000000204000000ULL, },
{ 0x0600020600020600ULL, 0x0206000206000206ULL, },
{ 0x0004000004000004ULL, 0x0000040000040000ULL, },
{ 0x0700050003000107ULL, 0x0005000300010700ULL, },
{ 0x0006000400020000ULL, 0x0600040002000006ULL, },
{ 0x0800080008000800ULL, 0x0800080008000800ULL, }, /* 16 */
{ 0x0008000800080008ULL, 0x0008000800080008ULL, },
{ 0x0801000300050007ULL, 0x0008010003000500ULL, },
{ 0x0000020004000600ULL, 0x0800000200040006ULL, },
{ 0x0802000600080200ULL, 0x0600080200060008ULL, },
{ 0x0000040008000004ULL, 0x0008000004000800ULL, },
{ 0x0803000801000700ULL, 0x0005000803000801ULL, },
{ 0x0000060000040008ULL, 0x0200080000060000ULL, },
{ 0x0804000804000804ULL, 0x0008040008040008ULL, }, /* 24 */
{ 0x0000080000080000ULL, 0x0800000800000800ULL, },
{ 0x0805000007000008ULL, 0x0100080300080500ULL, },
{ 0x0000080200080400ULL, 0x0006000008000008ULL, },
{ 0x0806000008020008ULL, 0x0600000802000806ULL, },
{ 0x0000080400000800ULL, 0x0008040000080000ULL, },
{ 0x0807000008050000ULL, 0x0803000008010008ULL, },
{ 0x0000080600000804ULL, 0x0000080200000800ULL, },
{ 0x0808000008080000ULL, 0x0808000008080000ULL, }, /* 32 */
{ 0x0000080800000808ULL, 0x0000080800000808ULL, },
{ 0x0808010000080300ULL, 0x0008050000080700ULL, },
{ 0x0000000802000008ULL, 0x0400000806000008ULL, },
{ 0x0808020000080600ULL, 0x0008080200000806ULL, },
{ 0x0000000804000008ULL, 0x0800000008040000ULL, },
{ 0x0808030000080801ULL, 0x0000080700000008ULL, },
{ 0x0000000806000000ULL, 0x0804000008080200ULL, },
{ 0x0808040000080804ULL, 0x0000080804000008ULL, }, /* 40 */
{ 0x0000000808000000ULL, 0x0808000000080800ULL, },
{ 0x0808050000000807ULL, 0x0000000808010000ULL, },
{ 0x0000000808020000ULL, 0x0808040000000806ULL, },
{ 0x0808060000000808ULL, 0x0200000808060000ULL, },
{ 0x0000000808040000ULL, 0x0008080000000808ULL, },
{ 0x0808070000000808ULL, 0x0500000008080300ULL, },
{ 0x0000000808060000ULL, 0x0008080400000008ULL, },
{ 0x0808080000000808ULL, 0x0800000008080800ULL, }, /* 48 */
{ 0x0000000808080000ULL, 0x0008080800000008ULL, },
{ 0x0808080100000008ULL, 0x0803000000080805ULL, },
{ 0x0000000008080200ULL, 0x0000080804000000ULL, },
{ 0x0808080200000008ULL, 0x0806000000080808ULL, },
{ 0x0000000008080400ULL, 0x0000080808000000ULL, },
{ 0x0808080300000008ULL, 0x0808010000000808ULL, },
{ 0x0000000008080600ULL, 0x0000000808040000ULL, },
{ 0x0808080400000008ULL, 0x0808040000000808ULL, }, /* 56 */
{ 0x0000000008080800ULL, 0x0000000808080000ULL, },
{ 0x0808080500000000ULL, 0x0808070000000008ULL, },
{ 0x0000000008080802ULL, 0x0000000808080400ULL, },
{ 0x0808080600000000ULL, 0x0808080200000008ULL, },
{ 0x0000000008080804ULL, 0x0000000008080800ULL, },
{ 0x0808080700000000ULL, 0x0808080500000000ULL, },
{ 0x0000000008080806ULL, 0x0000000008080804ULL, },
{ 0x0100030200000000ULL, 0x0000000007000100ULL, }, /* 64 */
{ 0x0501000000010200ULL, 0x0004010000000006ULL, },
{ 0x0100010101020101ULL, 0x0002020801000000ULL, },
{ 0x0000000000000300ULL, 0x0104010201000301ULL, },
{ 0x0101000000010000ULL, 0x0100000102020001ULL, },
{ 0x0200010108000005ULL, 0x0000000007010000ULL, },
{ 0x0100000000020100ULL, 0x0100000001040100ULL, },
{ 0x0601000401010101ULL, 0x0106000000000001ULL, },
{ 0x0000000200010300ULL, 0x0300030001010000ULL, }, /* 72 */
{ 0x0100020000020302ULL, 0x0100010101030100ULL, },
{ 0x0103040402020200ULL, 0x0102000000000000ULL, },
{ 0x0101040400010001ULL, 0x0201030000010103ULL, },
{ 0x0300000301000300ULL, 0x0100010200000200ULL, },
{ 0x0100000600000001ULL, 0x0401000100000000ULL, },
{ 0x0000000000010401ULL, 0x0300010402000000ULL, },
{ 0x0100010104000201ULL, 0x0200020200000003ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLOC_B(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLOC_B(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLOC.D
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLOC.D";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0000000000000040ULL, 0x0000000000000040ULL, }, /* 0 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000002ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000003ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000002ULL, },
{ 0x0000000000000004ULL, 0x0000000000000004ULL, }, /* 8 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000005ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000006ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000007ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000006ULL, },
{ 0x0000000000000008ULL, 0x0000000000000008ULL, }, /* 16 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000009ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x000000000000000aULL, 0x0000000000000006ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000bULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000002ULL, },
{ 0x000000000000000cULL, 0x0000000000000000ULL, }, /* 24 */
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x000000000000000dULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000eULL, 0x0000000000000006ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000fULL, 0x000000000000000bULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000010ULL, 0x0000000000000010ULL, }, /* 32 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000011ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000004ULL, },
{ 0x0000000000000012ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x0000000000000013ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x000000000000000cULL, },
{ 0x0000000000000014ULL, 0x0000000000000000ULL, }, /* 40 */
{ 0x0000000000000000ULL, 0x0000000000000010ULL, },
{ 0x0000000000000015ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000014ULL, },
{ 0x0000000000000016ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000017ULL, 0x0000000000000005ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000018ULL, 0x0000000000000008ULL, }, /* 48 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000019ULL, 0x000000000000000bULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001aULL, 0x000000000000000eULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001bULL, 0x0000000000000011ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001cULL, 0x0000000000000014ULL, }, /* 56 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001dULL, 0x0000000000000017ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001eULL, 0x000000000000001aULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001fULL, 0x000000000000001dULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000000ULL, }, /* 64 */
{ 0x0000000000000005ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000001ULL, },
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000002ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000006ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000003ULL, }, /* 72 */
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000001ULL, 0x0000000000000002ULL, },
{ 0x0000000000000003ULL, 0x0000000000000001ULL, },
{ 0x0000000000000001ULL, 0x0000000000000004ULL, },
{ 0x0000000000000000ULL, 0x0000000000000003ULL, },
{ 0x0000000000000001ULL, 0x0000000000000002ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLOC_D(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLOC_D(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLOC.H
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLOC.H";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0010001000100010ULL, 0x0010001000100010ULL, }, /* 0 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0001000100010001ULL, 0x0001000100010001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0002000200020002ULL, 0x0002000200020002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0003000000010003ULL, 0x0000000100030000ULL, },
{ 0x0000000200000000ULL, 0x0002000000000002ULL, },
{ 0x0004000400040004ULL, 0x0004000400040004ULL, }, /* 8 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0005000000030000ULL, 0x0001000500000003ULL, },
{ 0x0000000400000002ULL, 0x0000000000040000ULL, },
{ 0x0006000200000006ULL, 0x0002000000060002ULL, },
{ 0x0000000000040000ULL, 0x0000000400000000ULL, },
{ 0x0007000500030001ULL, 0x0000000000000007ULL, },
{ 0x0000000000000000ULL, 0x0006000400020000ULL, },
{ 0x0008000800080008ULL, 0x0008000800080008ULL, }, /* 16 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0009000000000000ULL, 0x0000000100030005ULL, },
{ 0x0000000200040006ULL, 0x0008000000000000ULL, },
{ 0x000a000000000002ULL, 0x0006000a00000000ULL, },
{ 0x0000000400080000ULL, 0x0000000000040008ULL, },
{ 0x000b000000010007ULL, 0x0000000000030009ULL, },
{ 0x0000000600000000ULL, 0x0002000800000000ULL, },
{ 0x000c00000004000cULL, 0x00000004000c0000ULL, }, /* 24 */
{ 0x0000000800000000ULL, 0x0008000000000008ULL, },
{ 0x000d000000070000ULL, 0x0001000b00000005ULL, },
{ 0x0000000a00000004ULL, 0x0000000000080000ULL, },
{ 0x000e0000000a0000ULL, 0x000600000002000eULL, },
{ 0x0000000c00000008ULL, 0x0000000400000000ULL, },
{ 0x000f0000000d0000ULL, 0x000b000000090000ULL, },
{ 0x0000000e0000000cULL, 0x0000000a00000008ULL, },
{ 0x0010000000100000ULL, 0x0010000000100000ULL, }, /* 32 */
{ 0x0000001000000010ULL, 0x0000001000000010ULL, },
{ 0x0010000100000003ULL, 0x0000000500000007ULL, },
{ 0x0000000000020000ULL, 0x0004000000060000ULL, },
{ 0x0010000200000006ULL, 0x0000000a0000000eULL, },
{ 0x0000000000040000ULL, 0x00080000000c0000ULL, },
{ 0x0010000300000009ULL, 0x0000000f00000000ULL, },
{ 0x0000000000060000ULL, 0x000c000000100002ULL, },
{ 0x001000040000000cULL, 0x0000001000040000ULL, }, /* 40 */
{ 0x0000000000080000ULL, 0x0010000000000008ULL, },
{ 0x001000050000000fULL, 0x0000000000090000ULL, },
{ 0x00000000000a0000ULL, 0x001000040000000eULL, },
{ 0x0010000600000010ULL, 0x00020000000e0000ULL, },
{ 0x00000000000c0000ULL, 0x0000000800000010ULL, },
{ 0x0010000700000010ULL, 0x0005000000100003ULL, },
{ 0x00000000000e0000ULL, 0x0000000c00000000ULL, },
{ 0x0010000800000010ULL, 0x0008000000100008ULL, }, /* 48 */
{ 0x0000000000100000ULL, 0x0000001000000000ULL, },
{ 0x0010000900000000ULL, 0x000b00000000000dULL, },
{ 0x0000000000100002ULL, 0x0000001000040000ULL, },
{ 0x0010000a00000000ULL, 0x000e000000000010ULL, },
{ 0x0000000000100004ULL, 0x0000001000080000ULL, },
{ 0x0010000b00000000ULL, 0x0010000100000010ULL, },
{ 0x0000000000100006ULL, 0x00000000000c0000ULL, },
{ 0x0010000c00000000ULL, 0x0010000400000010ULL, }, /* 56 */
{ 0x0000000000100008ULL, 0x0000000000100000ULL, },
{ 0x0010000d00000000ULL, 0x0010000700000000ULL, },
{ 0x000000000010000aULL, 0x0000000000100004ULL, },
{ 0x0010000e00000000ULL, 0x0010000a00000000ULL, },
{ 0x000000000010000cULL, 0x0000000000100008ULL, },
{ 0x0010000f00000000ULL, 0x0010000d00000000ULL, },
{ 0x000000000010000eULL, 0x000000000010000cULL, },
{ 0x0001000300000000ULL, 0x0000000000070001ULL, }, /* 64 */
{ 0x0005000000000002ULL, 0x0000000100000000ULL, },
{ 0x0001000100010001ULL, 0x0000000200010000ULL, },
{ 0x0000000000000003ULL, 0x0001000100010003ULL, },
{ 0x0001000000000000ULL, 0x0001000000020000ULL, },
{ 0x0002000100080000ULL, 0x0000000000070000ULL, },
{ 0x0001000000000001ULL, 0x0001000000010001ULL, },
{ 0x0006000000010001ULL, 0x0001000000000000ULL, },
{ 0x0000000000000003ULL, 0x0003000300010000ULL, }, /* 72 */
{ 0x0001000200000003ULL, 0x0001000100010001ULL, },
{ 0x0001000400020002ULL, 0x0001000000000000ULL, },
{ 0x0001000400000000ULL, 0x0002000300000001ULL, },
{ 0x0003000000010003ULL, 0x0001000100000002ULL, },
{ 0x0001000000000000ULL, 0x0004000000000000ULL, },
{ 0x0000000000000004ULL, 0x0003000100020000ULL, },
{ 0x0001000100040002ULL, 0x0002000200000000ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLOC_H(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLOC_H(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLOC.W
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLOC.W";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0000002000000020ULL, 0x0000002000000020ULL, }, /* 0 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000100000001ULL, 0x0000000100000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000200000002ULL, 0x0000000200000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000300000001ULL, 0x0000000000000003ULL, },
{ 0x0000000000000000ULL, 0x0000000200000000ULL, },
{ 0x0000000400000004ULL, 0x0000000400000004ULL, }, /* 8 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000500000003ULL, 0x0000000100000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000004ULL, },
{ 0x0000000600000000ULL, 0x0000000200000006ULL, },
{ 0x0000000000000004ULL, 0x0000000000000000ULL, },
{ 0x0000000700000003ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000600000002ULL, },
{ 0x0000000800000008ULL, 0x0000000800000008ULL, }, /* 16 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000900000000ULL, 0x0000000000000003ULL, },
{ 0x0000000000000004ULL, 0x0000000800000000ULL, },
{ 0x0000000a00000000ULL, 0x0000000600000000ULL, },
{ 0x0000000000000008ULL, 0x0000000000000004ULL, },
{ 0x0000000b00000001ULL, 0x0000000000000003ULL, },
{ 0x0000000000000000ULL, 0x0000000200000000ULL, },
{ 0x0000000c00000004ULL, 0x000000000000000cULL, }, /* 24 */
{ 0x0000000000000000ULL, 0x0000000800000000ULL, },
{ 0x0000000d00000007ULL, 0x0000000100000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x0000000e0000000aULL, 0x0000000600000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000f0000000dULL, 0x0000000b00000009ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000001000000010ULL, 0x0000001000000010ULL, }, /* 32 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000001100000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000002ULL, 0x0000000400000006ULL, },
{ 0x0000001200000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000004ULL, 0x000000080000000cULL, },
{ 0x0000001300000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000006ULL, 0x0000000c00000012ULL, },
{ 0x0000001400000000ULL, 0x0000000000000004ULL, }, /* 40 */
{ 0x0000000000000008ULL, 0x0000001000000000ULL, },
{ 0x0000001500000000ULL, 0x0000000000000009ULL, },
{ 0x000000000000000aULL, 0x0000001400000000ULL, },
{ 0x0000001600000000ULL, 0x000000020000000eULL, },
{ 0x000000000000000cULL, 0x0000000000000000ULL, },
{ 0x0000001700000000ULL, 0x0000000500000013ULL, },
{ 0x000000000000000eULL, 0x0000000000000000ULL, },
{ 0x0000001800000000ULL, 0x0000000800000018ULL, }, /* 48 */
{ 0x0000000000000010ULL, 0x0000000000000000ULL, },
{ 0x0000001900000000ULL, 0x0000000b00000000ULL, },
{ 0x0000000000000012ULL, 0x0000000000000004ULL, },
{ 0x0000001a00000000ULL, 0x0000000e00000000ULL, },
{ 0x0000000000000014ULL, 0x0000000000000008ULL, },
{ 0x0000001b00000000ULL, 0x0000001100000000ULL, },
{ 0x0000000000000016ULL, 0x000000000000000cULL, },
{ 0x0000001c00000000ULL, 0x0000001400000000ULL, }, /* 56 */
{ 0x0000000000000018ULL, 0x0000000000000010ULL, },
{ 0x0000001d00000000ULL, 0x0000001700000000ULL, },
{ 0x000000000000001aULL, 0x0000000000000014ULL, },
{ 0x0000001e00000000ULL, 0x0000001a00000000ULL, },
{ 0x000000000000001cULL, 0x0000000000000018ULL, },
{ 0x0000001f00000000ULL, 0x0000001d00000000ULL, },
{ 0x000000000000001eULL, 0x000000000000001cULL, },
{ 0x0000000100000000ULL, 0x0000000000000007ULL, }, /* 64 */
{ 0x0000000500000000ULL, 0x0000000000000000ULL, },
{ 0x0000000100000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000100000001ULL, },
{ 0x0000000100000000ULL, 0x0000000100000002ULL, },
{ 0x0000000200000008ULL, 0x0000000000000007ULL, },
{ 0x0000000100000000ULL, 0x0000000100000001ULL, },
{ 0x0000000600000001ULL, 0x0000000100000000ULL, },
{ 0x0000000000000000ULL, 0x0000000300000001ULL, }, /* 72 */
{ 0x0000000100000000ULL, 0x0000000100000001ULL, },
{ 0x0000000100000002ULL, 0x0000000100000000ULL, },
{ 0x0000000100000000ULL, 0x0000000200000000ULL, },
{ 0x0000000300000001ULL, 0x0000000100000000ULL, },
{ 0x0000000100000000ULL, 0x0000000400000000ULL, },
{ 0x0000000000000000ULL, 0x0000000300000002ULL, },
{ 0x0000000100000004ULL, 0x0000000200000000ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLOC_W(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLOC_W(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLZC.B
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLZC.B";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 0 */
{ 0x0808080808080808ULL, 0x0808080808080808ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0101010101010101ULL, 0x0101010101010101ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0202020202020202ULL, 0x0202020202020202ULL, },
{ 0x0000020000020000ULL, 0x0200000200000200ULL, },
{ 0x0301000301000301ULL, 0x0003010003010003ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 8 */
{ 0x0404040404040404ULL, 0x0404040404040404ULL, },
{ 0x0002040000000204ULL, 0x0000000204000000ULL, },
{ 0x0500000103050000ULL, 0x0103050000010305ULL, },
{ 0x0004000004000004ULL, 0x0000040000040000ULL, },
{ 0x0600020600020600ULL, 0x0206000206000206ULL, },
{ 0x0006000400020000ULL, 0x0600040002000006ULL, },
{ 0x0700050003000107ULL, 0x0005000300010700ULL, },
{ 0x0008000800080008ULL, 0x0008000800080008ULL, }, /* 16 */
{ 0x0800080008000800ULL, 0x0800080008000800ULL, },
{ 0x0000020004000600ULL, 0x0800000200040006ULL, },
{ 0x0801000300050007ULL, 0x0008010003000500ULL, },
{ 0x0000040008000004ULL, 0x0008000004000800ULL, },
{ 0x0802000600080200ULL, 0x0600080200060008ULL, },
{ 0x0000060000040008ULL, 0x0200080000060000ULL, },
{ 0x0803000801000700ULL, 0x0005000803000801ULL, },
{ 0x0000080000080000ULL, 0x0800000800000800ULL, }, /* 24 */
{ 0x0804000804000804ULL, 0x0008040008040008ULL, },
{ 0x0000080200080400ULL, 0x0006000008000008ULL, },
{ 0x0805000007000008ULL, 0x0100080300080500ULL, },
{ 0x0000080400000800ULL, 0x0008040000080000ULL, },
{ 0x0806000008020008ULL, 0x0600000802000806ULL, },
{ 0x0000080600000804ULL, 0x0000080200000800ULL, },
{ 0x0807000008050000ULL, 0x0803000008010008ULL, },
{ 0x0000080800000808ULL, 0x0000080800000808ULL, }, /* 32 */
{ 0x0808000008080000ULL, 0x0808000008080000ULL, },
{ 0x0000000802000008ULL, 0x0400000806000008ULL, },
{ 0x0808010000080300ULL, 0x0008050000080700ULL, },
{ 0x0000000804000008ULL, 0x0800000008040000ULL, },
{ 0x0808020000080600ULL, 0x0008080200000806ULL, },
{ 0x0000000806000000ULL, 0x0804000008080200ULL, },
{ 0x0808030000080801ULL, 0x0000080700000008ULL, },
{ 0x0000000808000000ULL, 0x0808000000080800ULL, }, /* 40 */
{ 0x0808040000080804ULL, 0x0000080804000008ULL, },
{ 0x0000000808020000ULL, 0x0808040000000806ULL, },
{ 0x0808050000000807ULL, 0x0000000808010000ULL, },
{ 0x0000000808040000ULL, 0x0008080000000808ULL, },
{ 0x0808060000000808ULL, 0x0200000808060000ULL, },
{ 0x0000000808060000ULL, 0x0008080400000008ULL, },
{ 0x0808070000000808ULL, 0x0500000008080300ULL, },
{ 0x0000000808080000ULL, 0x0008080800000008ULL, }, /* 48 */
{ 0x0808080000000808ULL, 0x0800000008080800ULL, },
{ 0x0000000008080200ULL, 0x0000080804000000ULL, },
{ 0x0808080100000008ULL, 0x0803000000080805ULL, },
{ 0x0000000008080400ULL, 0x0000080808000000ULL, },
{ 0x0808080200000008ULL, 0x0806000000080808ULL, },
{ 0x0000000008080600ULL, 0x0000000808040000ULL, },
{ 0x0808080300000008ULL, 0x0808010000000808ULL, },
{ 0x0000000008080800ULL, 0x0000000808080000ULL, }, /* 56 */
{ 0x0808080400000008ULL, 0x0808040000000808ULL, },
{ 0x0000000008080802ULL, 0x0000000808080400ULL, },
{ 0x0808080500000000ULL, 0x0808070000000008ULL, },
{ 0x0000000008080804ULL, 0x0000000008080800ULL, },
{ 0x0808080600000000ULL, 0x0808080200000008ULL, },
{ 0x0000000008080806ULL, 0x0000000008080804ULL, },
{ 0x0808080700000000ULL, 0x0808080500000000ULL, },
{ 0x0001000002010101ULL, 0x0101040100010004ULL, }, /* 64 */
{ 0x0000080101000004ULL, 0x0300000303020100ULL, },
{ 0x0001000000000000ULL, 0x0200000000020203ULL, },
{ 0x0101030101020001ULL, 0x0000000000010000ULL, },
{ 0x0000010101000101ULL, 0x0002010000000100ULL, },
{ 0x0002000000040200ULL, 0x0304010100000201ULL, },
{ 0x0002010501000001ULL, 0x0002040200000001ULL, },
{ 0x0000020000000000ULL, 0x0000010203010100ULL, },
{ 0x0203040001000001ULL, 0x0001000200000201ULL, }, /* 72 */
{ 0x0001000301000000ULL, 0x0002000000000001ULL, },
{ 0x0000000000000003ULL, 0x0000010101040103ULL, },
{ 0x0000000002000100ULL, 0x0000000101000000ULL, },
{ 0x0003020000010004ULL, 0x0001000001010003ULL, },
{ 0x0001020003020100ULL, 0x0000020001040201ULL, },
{ 0x0102010102000000ULL, 0x0001000000030201ULL, },
{ 0x0001000000010000ULL, 0x0001000001010300ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLZC_B(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLZC_B(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}
@@ -0,0 +1,144 @@
/*
* Test program for MSA instruction NLZC.D
*
* Copyright (C) 2018 Wave Computing, Inc.
* Copyright (C) 2018 Aleksandar Markovic <amarkovic@wavecomp.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <sys/time.h>
#include <stdint.h>
#include "../../../include/wrappers_msa.h"
#include "../../../include/test_inputs.h"
#include "../../../include/test_utils.h"
#define TEST_COUNT_TOTAL (PATTERN_INPUTS_COUNT + RANDOM_INPUTS_COUNT)
int32_t main(void)
{
char *instruction_name = "NLZC.D";
int32_t ret;
uint32_t i;
struct timeval start, end;
double elapsed_time;
uint64_t b128_result[TEST_COUNT_TOTAL][2];
uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 0 */
{ 0x0000000000000040ULL, 0x0000000000000040ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000002ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000002ULL, },
{ 0x0000000000000003ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 8 */
{ 0x0000000000000004ULL, 0x0000000000000004ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000005ULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000006ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000006ULL, },
{ 0x0000000000000007ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 16 */
{ 0x0000000000000008ULL, 0x0000000000000008ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x0000000000000009ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000aULL, 0x0000000000000006ULL, },
{ 0x0000000000000000ULL, 0x0000000000000002ULL, },
{ 0x000000000000000bULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, }, /* 24 */
{ 0x000000000000000cULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000dULL, 0x0000000000000001ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000eULL, 0x0000000000000006ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000000fULL, 0x000000000000000bULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 32 */
{ 0x0000000000000010ULL, 0x0000000000000010ULL, },
{ 0x0000000000000000ULL, 0x0000000000000004ULL, },
{ 0x0000000000000011ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000008ULL, },
{ 0x0000000000000012ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x000000000000000cULL, },
{ 0x0000000000000013ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000010ULL, }, /* 40 */
{ 0x0000000000000014ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000014ULL, },
{ 0x0000000000000015ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000016ULL, 0x0000000000000002ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000017ULL, 0x0000000000000005ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 48 */
{ 0x0000000000000018ULL, 0x0000000000000008ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000019ULL, 0x000000000000000bULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001aULL, 0x000000000000000eULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001bULL, 0x0000000000000011ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, }, /* 56 */
{ 0x000000000000001cULL, 0x0000000000000014ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001dULL, 0x0000000000000017ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001eULL, 0x000000000000001aULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x000000000000001fULL, 0x000000000000001dULL, },
{ 0x0000000000000000ULL, 0x0000000000000001ULL, }, /* 64 */
{ 0x0000000000000000ULL, 0x0000000000000003ULL, },
{ 0x0000000000000000ULL, 0x0000000000000002ULL, },
{ 0x0000000000000001ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000003ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000002ULL, 0x0000000000000000ULL, }, /* 72 */
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
{ 0x0000000000000001ULL, 0x0000000000000000ULL, },
{ 0x0000000000000000ULL, 0x0000000000000000ULL, },
};
gettimeofday(&start, NULL);
for (i = 0; i < TEST_COUNT_TOTAL; i++) {
if (i < PATTERN_INPUTS_COUNT) {
do_msa_NLZC_D(b128_pattern[i], b128_result[i]);
} else {
do_msa_NLZC_D(b128_random[i - PATTERN_INPUTS_COUNT],
b128_result[i]);
}
}
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
&b128_result[0][0], &b128_expect[0][0]);
return ret;
}

Some files were not shown because too many files have changed in this diff Show More