qemu-sparc queue
-----BEGIN PGP SIGNATURE----- iQFSBAABCgA8FiEEzGIauY6CIA2RXMnEW8LFb64PMh8FAmY4wZceHG1hcmsuY2F2 ZS1heWxhbmRAaWxhbmRlLmNvLnVrAAoJEFvCxW+uDzIftQsH+wfIWymTdQMowfM6 Ze/T8KODn+MqU5eg25VPSTojnmr7LFaCj2yK6zWX61RwIqtMc3NaxX0G7ksW12/g 35ACqiEEd5WRDhAtVhj5Wp+WEDoR4AD3LWIaN7a/qjO3qb78l7Bujw3qXzGSq4lQ hST6dTgMwn5LhJOyz+5dORVUK1UZSBuDxHeKRHgdoFi6yqGQ5bao5TpaDYOnGSbx 8KPrAFfXG1T6xRS8Ih5HXAPE5VJztLFPiVtCTTrETDP/o8EzvOZj5y/nJVZXXC3N 57g+QyJX9EdrRZvobef4LnNnoZyiqG+uQNugglqZqjiiLjl6AzYxI+ed0hU+cZR9 pz76Hr8= =i2cV -----END PGP SIGNATURE----- Merge tag 'qemu-sparc-20240506' of https://github.com/mcayland/qemu into staging qemu-sparc queue # -----BEGIN PGP SIGNATURE----- # # iQFSBAABCgA8FiEEzGIauY6CIA2RXMnEW8LFb64PMh8FAmY4wZceHG1hcmsuY2F2 # ZS1heWxhbmRAaWxhbmRlLmNvLnVrAAoJEFvCxW+uDzIftQsH+wfIWymTdQMowfM6 # Ze/T8KODn+MqU5eg25VPSTojnmr7LFaCj2yK6zWX61RwIqtMc3NaxX0G7ksW12/g # 35ACqiEEd5WRDhAtVhj5Wp+WEDoR4AD3LWIaN7a/qjO3qb78l7Bujw3qXzGSq4lQ # hST6dTgMwn5LhJOyz+5dORVUK1UZSBuDxHeKRHgdoFi6yqGQ5bao5TpaDYOnGSbx # 8KPrAFfXG1T6xRS8Ih5HXAPE5VJztLFPiVtCTTrETDP/o8EzvOZj5y/nJVZXXC3N # 57g+QyJX9EdrRZvobef4LnNnoZyiqG+uQNugglqZqjiiLjl6AzYxI+ed0hU+cZR9 # pz76Hr8= # =i2cV # -----END PGP SIGNATURE----- # gpg: Signature made Mon 06 May 2024 04:40:07 AM PDT # gpg: using RSA key CC621AB98E82200D915CC9C45BC2C56FAE0F321F # gpg: issuer "mark.cave-ayland@ilande.co.uk" # gpg: Good signature from "Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>" [full] * tag 'qemu-sparc-20240506' of https://github.com/mcayland/qemu: target/sparc: Split out do_ms16b target/sparc: Fix FPMERGE target/sparc: Fix FMULD8*X16 target/sparc: Fix FMUL8x16A{U,L} target/sparc: Fix FMUL8x16 target/sparc: Fix FEXPAND linux-user/sparc: Add more hwcap bits for sparc64 hw/sparc64: set iommu_platform=on for virtio devices attached to the sun4u machine docs/about: Deprecate the old "UltraSparc" CPU names that contain a "+" docs/system/target-sparc: Improve the Sparc documentation target/sparc/cpu: Avoid spaces by default in the CPU names target/sparc/cpu: Rename the CPU models with a "+" in their names Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
e116b92d01
docs
hw/sparc64
linux-user
qom
target/sparc
@ -194,6 +194,15 @@ in the QEMU object model anymore. ``power5+``, ``power5+_v2.1``,
|
|||||||
an alias, but for consistency these will get removed in a future
|
an alias, but for consistency these will get removed in a future
|
||||||
release, too. Use ``power5p_v2.1`` and ``power7p_v2.1`` instead.
|
release, too. Use ``power5p_v2.1`` and ``power7p_v2.1`` instead.
|
||||||
|
|
||||||
|
``Sun-UltraSparc-IIIi+`` and ``Sun-UltraSparc-IV+`` CPU names (since 9.1)
|
||||||
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||||
|
|
||||||
|
The character "+" in device (and thus also CPU) names is not allowed
|
||||||
|
in the QEMU object model anymore. ``Sun-UltraSparc-IIIi+`` and
|
||||||
|
``Sun-UltraSparc-IV+`` are currently still supported via a workaround,
|
||||||
|
but for consistency these will get removed in a future release, too.
|
||||||
|
Use ``Sun-UltraSparc-IIIi-plus`` and ``Sun-UltraSparc-IV-plus`` instead.
|
||||||
|
|
||||||
CRIS CPU architecture (since 9.0)
|
CRIS CPU architecture (since 9.0)
|
||||||
'''''''''''''''''''''''''''''''''
|
'''''''''''''''''''''''''''''''''
|
||||||
|
|
||||||
|
@ -27,6 +27,11 @@ architecture machines:
|
|||||||
The emulation is somewhat complete. SMP up to 16 CPUs is supported, but
|
The emulation is somewhat complete. SMP up to 16 CPUs is supported, but
|
||||||
Linux limits the number of usable CPUs to 4.
|
Linux limits the number of usable CPUs to 4.
|
||||||
|
|
||||||
|
The list of available CPUs can be viewed by starting QEMU with ``-cpu help``.
|
||||||
|
Optional boolean features can be added with a "+" in front of the feature name,
|
||||||
|
or disabled with a "-" in front of the name, for example
|
||||||
|
``-cpu TI-SuperSparc-II,+float128``.
|
||||||
|
|
||||||
QEMU emulates the following sun4m peripherals:
|
QEMU emulates the following sun4m peripherals:
|
||||||
|
|
||||||
- IOMMU
|
- IOMMU
|
||||||
@ -55,8 +60,5 @@ OpenBIOS is a free (GPL v2) portable firmware implementation. The goal
|
|||||||
is to implement a 100% IEEE 1275-1994 (referred to as Open Firmware)
|
is to implement a 100% IEEE 1275-1994 (referred to as Open Firmware)
|
||||||
compliant firmware.
|
compliant firmware.
|
||||||
|
|
||||||
A sample Linux 2.6 series kernel and ram disk image are available on the
|
Please note that currently older Solaris kernels don't work; this is probably
|
||||||
QEMU web site. There are still issues with NetBSD and OpenBSD, but most
|
due to interface issues between OpenBIOS and Solaris.
|
||||||
kernel versions work. Please note that currently older Solaris kernels
|
|
||||||
don't work probably due to interface issues between OpenBIOS and
|
|
||||||
Solaris.
|
|
||||||
|
@ -793,6 +793,12 @@ static void sun4v_init(MachineState *machine)
|
|||||||
sun4uv_init(get_system_memory(), machine, &hwdefs[1]);
|
sun4uv_init(get_system_memory(), machine, &hwdefs[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GlobalProperty hw_compat_sparc64[] = {
|
||||||
|
{ "virtio-pci", "disable-legacy", "on", .optional = true },
|
||||||
|
{ "virtio-device", "iommu_platform", "on" },
|
||||||
|
};
|
||||||
|
static const size_t hw_compat_sparc64_len = G_N_ELEMENTS(hw_compat_sparc64);
|
||||||
|
|
||||||
static void sun4u_class_init(ObjectClass *oc, void *data)
|
static void sun4u_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_CLASS(oc);
|
MachineClass *mc = MACHINE_CLASS(oc);
|
||||||
@ -810,6 +816,7 @@ static void sun4u_class_init(ObjectClass *oc, void *data)
|
|||||||
mc->default_nic = "sunhme";
|
mc->default_nic = "sunhme";
|
||||||
mc->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
|
mc->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
|
||||||
fwc->get_dev_path = sun4u_fw_dev_path;
|
fwc->get_dev_path = sun4u_fw_dev_path;
|
||||||
|
compat_props_add(mc->compat_props, hw_compat_sparc64, hw_compat_sparc64_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo sun4u_type = {
|
static const TypeInfo sun4u_type = {
|
||||||
|
@ -969,24 +969,44 @@ const char *elf_hwcap2_str(uint32_t bit)
|
|||||||
#endif /* TARGET_ARM */
|
#endif /* TARGET_ARM */
|
||||||
|
|
||||||
#ifdef TARGET_SPARC
|
#ifdef TARGET_SPARC
|
||||||
#ifdef TARGET_SPARC64
|
|
||||||
|
|
||||||
#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
|
#ifndef TARGET_SPARC64
|
||||||
| HWCAP_SPARC_MULDIV | HWCAP_SPARC_V9)
|
# define ELF_CLASS ELFCLASS32
|
||||||
#ifndef TARGET_ABI32
|
# define ELF_ARCH EM_SPARC
|
||||||
#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
|
#elif defined(TARGET_ABI32)
|
||||||
|
# define ELF_CLASS ELFCLASS32
|
||||||
|
# define elf_check_arch(x) ((x) == EM_SPARC32PLUS || (x) == EM_SPARC)
|
||||||
#else
|
#else
|
||||||
#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
|
# define ELF_CLASS ELFCLASS64
|
||||||
|
# define ELF_ARCH EM_SPARCV9
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ELF_CLASS ELFCLASS64
|
#include "elf.h"
|
||||||
#define ELF_ARCH EM_SPARCV9
|
|
||||||
#else
|
#define ELF_HWCAP get_elf_hwcap()
|
||||||
#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
|
|
||||||
| HWCAP_SPARC_MULDIV)
|
static uint32_t get_elf_hwcap(void)
|
||||||
#define ELF_CLASS ELFCLASS32
|
{
|
||||||
#define ELF_ARCH EM_SPARC
|
/* There are not many sparc32 hwcap bits -- we have all of them. */
|
||||||
#endif /* TARGET_SPARC64 */
|
uint32_t r = HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR |
|
||||||
|
HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV;
|
||||||
|
|
||||||
|
#ifdef TARGET_SPARC64
|
||||||
|
CPUSPARCState *env = cpu_env(thread_cpu);
|
||||||
|
uint32_t features = env->def.features;
|
||||||
|
|
||||||
|
r |= HWCAP_SPARC_V9 | HWCAP_SPARC_V8PLUS;
|
||||||
|
/* 32x32 multiply and divide are efficient. */
|
||||||
|
r |= HWCAP_SPARC_MUL32 | HWCAP_SPARC_DIV32;
|
||||||
|
/* We don't have an internal feature bit for this. */
|
||||||
|
r |= HWCAP_SPARC_POPC;
|
||||||
|
r |= features & CPU_FEATURE_FSMULD ? HWCAP_SPARC_FSMULD : 0;
|
||||||
|
r |= features & CPU_FEATURE_VIS1 ? HWCAP_SPARC_VIS : 0;
|
||||||
|
r |= features & CPU_FEATURE_VIS2 ? HWCAP_SPARC_VIS2 : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void init_thread(struct target_pt_regs *regs,
|
static inline void init_thread(struct target_pt_regs *regs,
|
||||||
struct image_info *infop)
|
struct image_info *infop)
|
||||||
|
@ -157,14 +157,6 @@ static bool type_name_is_valid(const char *name)
|
|||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
"0123456789-_.");
|
"0123456789-_.");
|
||||||
|
|
||||||
/* Allow some legacy names with '+' in it for compatibility reasons */
|
|
||||||
if (name[plen] == '+') {
|
|
||||||
if (plen >= 17 && g_str_has_prefix(name, "Sun-UltraSparc-I")) {
|
|
||||||
/* Allow "Sun-UltraSparc-IV+" and "Sun-UltraSparc-IIIi+" */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return plen == slen;
|
return plen == slen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
|
|||||||
static const sparc_def_t sparc_defs[] = {
|
static const sparc_def_t sparc_defs[] = {
|
||||||
#ifdef TARGET_SPARC64
|
#ifdef TARGET_SPARC64
|
||||||
{
|
{
|
||||||
.name = "Fujitsu Sparc64",
|
.name = "Fujitsu-Sparc64",
|
||||||
.iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)),
|
.iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -215,7 +215,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Fujitsu Sparc64 III",
|
.name = "Fujitsu-Sparc64-III",
|
||||||
.iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)),
|
.iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -224,7 +224,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Fujitsu Sparc64 IV",
|
.name = "Fujitsu-Sparc64-IV",
|
||||||
.iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)),
|
.iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -233,7 +233,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Fujitsu Sparc64 V",
|
.name = "Fujitsu-Sparc64-V",
|
||||||
.iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)),
|
.iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -242,7 +242,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI UltraSparc I",
|
.name = "TI-UltraSparc-I",
|
||||||
.iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
|
.iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -251,7 +251,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI UltraSparc II",
|
.name = "TI-UltraSparc-II",
|
||||||
.iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)),
|
.iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -260,7 +260,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI UltraSparc IIi",
|
.name = "TI-UltraSparc-IIi",
|
||||||
.iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)),
|
.iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -269,7 +269,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI UltraSparc IIe",
|
.name = "TI-UltraSparc-IIe",
|
||||||
.iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)),
|
.iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -278,7 +278,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc III",
|
.name = "Sun-UltraSparc-III",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -287,7 +287,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc III Cu",
|
.name = "Sun-UltraSparc-III-Cu",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_3,
|
.mmu_version = mmu_us_3,
|
||||||
@ -296,7 +296,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc IIIi",
|
.name = "Sun-UltraSparc-IIIi",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -305,7 +305,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc IV",
|
.name = "Sun-UltraSparc-IV",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_4,
|
.mmu_version = mmu_us_4,
|
||||||
@ -314,7 +314,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc IV+",
|
.name = "Sun-UltraSparc-IV-plus",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -323,7 +323,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT,
|
.features = CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc IIIi+",
|
.name = "Sun-UltraSparc-IIIi-plus",
|
||||||
.iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_3,
|
.mmu_version = mmu_us_3,
|
||||||
@ -332,7 +332,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc T1",
|
.name = "Sun-UltraSparc-T1",
|
||||||
/* defined in sparc_ifu_fdp.v and ctu.h */
|
/* defined in sparc_ifu_fdp.v and ctu.h */
|
||||||
.iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
@ -343,7 +343,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
| CPU_FEATURE_GL,
|
| CPU_FEATURE_GL,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Sun UltraSparc T2",
|
.name = "Sun-UltraSparc-T2",
|
||||||
/* defined in tlu_asi_ctl.v and n2_revid_cust.v */
|
/* defined in tlu_asi_ctl.v and n2_revid_cust.v */
|
||||||
.iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)),
|
.iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
@ -354,7 +354,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
| CPU_FEATURE_GL,
|
| CPU_FEATURE_GL,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "NEC UltraSparc I",
|
.name = "NEC-UltraSparc-I",
|
||||||
.iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
|
.iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
|
||||||
.fpu_version = 0x00000000,
|
.fpu_version = 0x00000000,
|
||||||
.mmu_version = mmu_us_12,
|
.mmu_version = mmu_us_12,
|
||||||
@ -364,7 +364,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
},
|
},
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
.name = "Fujitsu MB86904",
|
.name = "Fujitsu-MB86904",
|
||||||
.iu_version = 0x04 << 24, /* Impl 0, ver 4 */
|
.iu_version = 0x04 << 24, /* Impl 0, ver 4 */
|
||||||
.fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
|
.fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
|
||||||
.mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
|
.mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
|
||||||
@ -377,7 +377,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Fujitsu MB86907",
|
.name = "Fujitsu-MB86907",
|
||||||
.iu_version = 0x05 << 24, /* Impl 0, ver 5 */
|
.iu_version = 0x05 << 24, /* Impl 0, ver 5 */
|
||||||
.fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
|
.fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
|
||||||
.mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
|
.mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
|
||||||
@ -390,7 +390,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI MicroSparc I",
|
.name = "TI-MicroSparc-I",
|
||||||
.iu_version = 0x41000000,
|
.iu_version = 0x41000000,
|
||||||
.fpu_version = 4 << FSR_VER_SHIFT,
|
.fpu_version = 4 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x41000000,
|
.mmu_version = 0x41000000,
|
||||||
@ -403,7 +403,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_FEATURE_MUL | CPU_FEATURE_DIV,
|
.features = CPU_FEATURE_MUL | CPU_FEATURE_DIV,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI MicroSparc II",
|
.name = "TI-MicroSparc-II",
|
||||||
.iu_version = 0x42000000,
|
.iu_version = 0x42000000,
|
||||||
.fpu_version = 4 << FSR_VER_SHIFT,
|
.fpu_version = 4 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x02000000,
|
.mmu_version = 0x02000000,
|
||||||
@ -416,7 +416,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI MicroSparc IIep",
|
.name = "TI-MicroSparc-IIep",
|
||||||
.iu_version = 0x42000000,
|
.iu_version = 0x42000000,
|
||||||
.fpu_version = 4 << FSR_VER_SHIFT,
|
.fpu_version = 4 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x04000000,
|
.mmu_version = 0x04000000,
|
||||||
@ -429,7 +429,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc 40", /* STP1020NPGA */
|
.name = "TI-SuperSparc-40", /* STP1020NPGA */
|
||||||
.iu_version = 0x41000000, /* SuperSPARC 2.x */
|
.iu_version = 0x41000000, /* SuperSPARC 2.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x00000800, /* SuperSPARC 2.x, no MXCC */
|
.mmu_version = 0x00000800, /* SuperSPARC 2.x, no MXCC */
|
||||||
@ -442,7 +442,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc 50", /* STP1020PGA */
|
.name = "TI-SuperSparc-50", /* STP1020PGA */
|
||||||
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
|
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
|
||||||
@ -455,7 +455,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc 51",
|
.name = "TI-SuperSparc-51",
|
||||||
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
|
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
|
||||||
@ -469,7 +469,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc 60", /* STP1020APGA */
|
.name = "TI-SuperSparc-60", /* STP1020APGA */
|
||||||
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
.iu_version = 0x40000000, /* SuperSPARC 3.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
|
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
|
||||||
@ -482,7 +482,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc 61",
|
.name = "TI-SuperSparc-61",
|
||||||
.iu_version = 0x44000000, /* SuperSPARC 3.x */
|
.iu_version = 0x44000000, /* SuperSPARC 3.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
|
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
|
||||||
@ -496,7 +496,7 @@ static const sparc_def_t sparc_defs[] = {
|
|||||||
.features = CPU_DEFAULT_FEATURES,
|
.features = CPU_DEFAULT_FEATURES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "TI SuperSparc II",
|
.name = "TI-SuperSparc-II",
|
||||||
.iu_version = 0x40000000, /* SuperSPARC II 1.x */
|
.iu_version = 0x40000000, /* SuperSPARC II 1.x */
|
||||||
.fpu_version = 0 << FSR_VER_SHIFT,
|
.fpu_version = 0 << FSR_VER_SHIFT,
|
||||||
.mmu_version = 0x08000000, /* SuperSPARC II 1.x, MXCC */
|
.mmu_version = 0x08000000, /* SuperSPARC II 1.x, MXCC */
|
||||||
@ -762,6 +762,16 @@ static ObjectClass *sparc_cpu_class_by_name(const char *cpu_model)
|
|||||||
char *typename;
|
char *typename;
|
||||||
|
|
||||||
typename = sparc_cpu_type_name(cpu_model);
|
typename = sparc_cpu_type_name(cpu_model);
|
||||||
|
|
||||||
|
/* Fix up legacy names with '+' in it */
|
||||||
|
if (g_str_equal(typename, SPARC_CPU_TYPE_NAME("Sun-UltraSparc-IV+"))) {
|
||||||
|
g_free(typename);
|
||||||
|
typename = g_strdup(SPARC_CPU_TYPE_NAME("Sun-UltraSparc-IV-plus"));
|
||||||
|
} else if (g_str_equal(typename, SPARC_CPU_TYPE_NAME("Sun-UltraSparc-IIIi+"))) {
|
||||||
|
g_free(typename);
|
||||||
|
typename = g_strdup(SPARC_CPU_TYPE_NAME("Sun-UltraSparc-IIIi-plus"));
|
||||||
|
}
|
||||||
|
|
||||||
oc = object_class_by_name(typename);
|
oc = object_class_by_name(typename);
|
||||||
g_free(typename);
|
g_free(typename);
|
||||||
return oc;
|
return oc;
|
||||||
|
@ -94,15 +94,12 @@ DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_WG, s64, env, f32)
|
|||||||
DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_WG, s64, env, f64)
|
DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_WG, s64, env, f64)
|
||||||
DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_WG, s64, env, i128)
|
DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_WG, s64, env, i128)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i32, i32)
|
||||||
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i32, i64)
|
||||||
DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(fmul8x16a, TCG_CALL_NO_RWG_SE, i64, i32, s32)
|
||||||
DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
|
||||||
DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_1(fexpand, TCG_CALL_NO_RWG_SE, i64, i32)
|
||||||
DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
|
||||||
DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
|
||||||
DEF_HELPER_FLAGS_3(pdist, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64)
|
DEF_HELPER_FLAGS_3(pdist, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_NO_RWG_SE, i32, i64, i64)
|
DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_NO_RWG_SE, i32, i64, i64)
|
||||||
DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64)
|
DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64)
|
||||||
|
@ -352,7 +352,7 @@ FCMPEq 10 000 cc:2 110101 rs1:5 0 0101 0111 rs2:5
|
|||||||
FALIGNDATAg 10 ..... 110110 ..... 0 0100 1000 ..... @r_r_r
|
FALIGNDATAg 10 ..... 110110 ..... 0 0100 1000 ..... @r_r_r
|
||||||
FPMERGE 10 ..... 110110 ..... 0 0100 1011 ..... @r_r_r
|
FPMERGE 10 ..... 110110 ..... 0 0100 1011 ..... @r_r_r
|
||||||
BSHUFFLE 10 ..... 110110 ..... 0 0100 1100 ..... @r_r_r
|
BSHUFFLE 10 ..... 110110 ..... 0 0100 1100 ..... @r_r_r
|
||||||
FEXPAND 10 ..... 110110 ..... 0 0100 1101 ..... @r_r_r
|
FEXPAND 10 ..... 110110 00000 0 0100 1101 ..... @r_r2
|
||||||
|
|
||||||
FSRCd 10 ..... 110110 ..... 0 0111 0100 00000 @r_r1 # FSRC1d
|
FSRCd 10 ..... 110110 ..... 0 0111 0100 00000 @r_r1 # FSRC1d
|
||||||
FSRCs 10 ..... 110110 ..... 0 0111 0101 00000 @r_r1 # FSRC1s
|
FSRCs 10 ..... 110110 ..... 0 0111 0101 00000 @r_r1 # FSRC1s
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
|
# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
|
||||||
# define gen_helper_done(E) qemu_build_not_reached()
|
# define gen_helper_done(E) qemu_build_not_reached()
|
||||||
# define gen_helper_flushw(E) qemu_build_not_reached()
|
# define gen_helper_flushw(E) qemu_build_not_reached()
|
||||||
|
# define gen_helper_fmul8x16a(D, S1, S2) qemu_build_not_reached()
|
||||||
# define gen_helper_rdccr(D, E) qemu_build_not_reached()
|
# define gen_helper_rdccr(D, E) qemu_build_not_reached()
|
||||||
# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
|
# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
|
||||||
# define gen_helper_restored(E) qemu_build_not_reached()
|
# define gen_helper_restored(E) qemu_build_not_reached()
|
||||||
@ -72,11 +73,7 @@
|
|||||||
# define gen_helper_fexpand ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fexpand ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fmul8sux16 ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fmul8sux16 ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fmul8ulx16 ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fmul8ulx16 ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fmul8x16al ({ qemu_build_not_reached(); NULL; })
|
|
||||||
# define gen_helper_fmul8x16au ({ qemu_build_not_reached(); NULL; })
|
|
||||||
# define gen_helper_fmul8x16 ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fmul8x16 ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fmuld8sux16 ({ qemu_build_not_reached(); NULL; })
|
|
||||||
# define gen_helper_fmuld8ulx16 ({ qemu_build_not_reached(); NULL; })
|
|
||||||
# define gen_helper_fpmerge ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fpmerge ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fqtox ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fqtox ({ qemu_build_not_reached(); NULL; })
|
||||||
# define gen_helper_fstox ({ qemu_build_not_reached(); NULL; })
|
# define gen_helper_fstox ({ qemu_build_not_reached(); NULL; })
|
||||||
@ -719,6 +716,60 @@ static void gen_op_bshuffle(TCGv_i64 dst, TCGv_i64 src1, TCGv_i64 src2)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_op_fmul8x16al(TCGv_i64 dst, TCGv_i32 src1, TCGv_i32 src2)
|
||||||
|
{
|
||||||
|
tcg_gen_ext16s_i32(src2, src2);
|
||||||
|
gen_helper_fmul8x16a(dst, src1, src2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gen_op_fmul8x16au(TCGv_i64 dst, TCGv_i32 src1, TCGv_i32 src2)
|
||||||
|
{
|
||||||
|
tcg_gen_sari_i32(src2, src2, 16);
|
||||||
|
gen_helper_fmul8x16a(dst, src1, src2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gen_op_fmuld8ulx16(TCGv_i64 dst, TCGv_i32 src1, TCGv_i32 src2)
|
||||||
|
{
|
||||||
|
TCGv_i32 t0 = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t2 = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_ext8u_i32(t0, src1);
|
||||||
|
tcg_gen_ext16s_i32(t1, src2);
|
||||||
|
tcg_gen_mul_i32(t0, t0, t1);
|
||||||
|
|
||||||
|
tcg_gen_extract_i32(t1, src1, 16, 8);
|
||||||
|
tcg_gen_sextract_i32(t2, src2, 16, 16);
|
||||||
|
tcg_gen_mul_i32(t1, t1, t2);
|
||||||
|
|
||||||
|
tcg_gen_concat_i32_i64(dst, t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gen_op_fmuld8sux16(TCGv_i64 dst, TCGv_i32 src1, TCGv_i32 src2)
|
||||||
|
{
|
||||||
|
TCGv_i32 t0 = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t2 = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The insn description talks about extracting the upper 8 bits
|
||||||
|
* of the signed 16-bit input rs1, performing the multiply, then
|
||||||
|
* shifting left by 8 bits. Instead, zap the lower 8 bits of
|
||||||
|
* the rs1 input, which avoids the need for two shifts.
|
||||||
|
*/
|
||||||
|
tcg_gen_ext16s_i32(t0, src1);
|
||||||
|
tcg_gen_andi_i32(t0, t0, ~0xff);
|
||||||
|
tcg_gen_ext16s_i32(t1, src2);
|
||||||
|
tcg_gen_mul_i32(t0, t0, t1);
|
||||||
|
|
||||||
|
tcg_gen_sextract_i32(t1, src1, 16, 16);
|
||||||
|
tcg_gen_andi_i32(t1, t1, ~0xff);
|
||||||
|
tcg_gen_sextract_i32(t2, src2, 16, 16);
|
||||||
|
tcg_gen_mul_i32(t1, t1, t2);
|
||||||
|
|
||||||
|
tcg_gen_concat_i32_i64(dst, t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
static void finishing_insn(DisasContext *dc)
|
static void finishing_insn(DisasContext *dc)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -4358,6 +4409,25 @@ TRANS(FSQRTd, ALL, do_env_dd, a, gen_helper_fsqrtd)
|
|||||||
TRANS(FxTOd, 64, do_env_dd, a, gen_helper_fxtod)
|
TRANS(FxTOd, 64, do_env_dd, a, gen_helper_fxtod)
|
||||||
TRANS(FdTOx, 64, do_env_dd, a, gen_helper_fdtox)
|
TRANS(FdTOx, 64, do_env_dd, a, gen_helper_fdtox)
|
||||||
|
|
||||||
|
static bool do_df(DisasContext *dc, arg_r_r *a,
|
||||||
|
void (*func)(TCGv_i64, TCGv_i32))
|
||||||
|
{
|
||||||
|
TCGv_i64 dst;
|
||||||
|
TCGv_i32 src;
|
||||||
|
|
||||||
|
if (gen_trap_ifnofpu(dc)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst = tcg_temp_new_i64();
|
||||||
|
src = gen_load_fpr_F(dc, a->rs);
|
||||||
|
func(dst, src);
|
||||||
|
gen_store_fpr_D(dc, a->rd, dst);
|
||||||
|
return advance_pc(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRANS(FEXPAND, VIS1, do_df, a, gen_helper_fexpand)
|
||||||
|
|
||||||
static bool do_env_df(DisasContext *dc, arg_r_r *a,
|
static bool do_env_df(DisasContext *dc, arg_r_r *a,
|
||||||
void (*func)(TCGv_i64, TCGv_env, TCGv_i32))
|
void (*func)(TCGv_i64, TCGv_env, TCGv_i32))
|
||||||
{
|
{
|
||||||
@ -4564,6 +4634,50 @@ TRANS(FSUBs, ALL, do_env_fff, a, gen_helper_fsubs)
|
|||||||
TRANS(FMULs, ALL, do_env_fff, a, gen_helper_fmuls)
|
TRANS(FMULs, ALL, do_env_fff, a, gen_helper_fmuls)
|
||||||
TRANS(FDIVs, ALL, do_env_fff, a, gen_helper_fdivs)
|
TRANS(FDIVs, ALL, do_env_fff, a, gen_helper_fdivs)
|
||||||
|
|
||||||
|
static bool do_dff(DisasContext *dc, arg_r_r_r *a,
|
||||||
|
void (*func)(TCGv_i64, TCGv_i32, TCGv_i32))
|
||||||
|
{
|
||||||
|
TCGv_i64 dst;
|
||||||
|
TCGv_i32 src1, src2;
|
||||||
|
|
||||||
|
if (gen_trap_ifnofpu(dc)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst = gen_dest_fpr_D(dc, a->rd);
|
||||||
|
src1 = gen_load_fpr_F(dc, a->rs1);
|
||||||
|
src2 = gen_load_fpr_F(dc, a->rs2);
|
||||||
|
func(dst, src1, src2);
|
||||||
|
gen_store_fpr_D(dc, a->rd, dst);
|
||||||
|
return advance_pc(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRANS(FMUL8x16AU, VIS1, do_dff, a, gen_op_fmul8x16au)
|
||||||
|
TRANS(FMUL8x16AL, VIS1, do_dff, a, gen_op_fmul8x16al)
|
||||||
|
TRANS(FMULD8SUx16, VIS1, do_dff, a, gen_op_fmuld8sux16)
|
||||||
|
TRANS(FMULD8ULx16, VIS1, do_dff, a, gen_op_fmuld8ulx16)
|
||||||
|
TRANS(FPMERGE, VIS1, do_dff, a, gen_helper_fpmerge)
|
||||||
|
|
||||||
|
static bool do_dfd(DisasContext *dc, arg_r_r_r *a,
|
||||||
|
void (*func)(TCGv_i64, TCGv_i32, TCGv_i64))
|
||||||
|
{
|
||||||
|
TCGv_i64 dst, src2;
|
||||||
|
TCGv_i32 src1;
|
||||||
|
|
||||||
|
if (gen_trap_ifnofpu(dc)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst = gen_dest_fpr_D(dc, a->rd);
|
||||||
|
src1 = gen_load_fpr_F(dc, a->rs1);
|
||||||
|
src2 = gen_load_fpr_D(dc, a->rs2);
|
||||||
|
func(dst, src1, src2);
|
||||||
|
gen_store_fpr_D(dc, a->rd, dst);
|
||||||
|
return advance_pc(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRANS(FMUL8x16, VIS1, do_dfd, a, gen_helper_fmul8x16)
|
||||||
|
|
||||||
static bool do_ddd(DisasContext *dc, arg_r_r_r *a,
|
static bool do_ddd(DisasContext *dc, arg_r_r_r *a,
|
||||||
void (*func)(TCGv_i64, TCGv_i64, TCGv_i64))
|
void (*func)(TCGv_i64, TCGv_i64, TCGv_i64))
|
||||||
{
|
{
|
||||||
@ -4581,15 +4695,8 @@ static bool do_ddd(DisasContext *dc, arg_r_r_r *a,
|
|||||||
return advance_pc(dc);
|
return advance_pc(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRANS(FMUL8x16, VIS1, do_ddd, a, gen_helper_fmul8x16)
|
|
||||||
TRANS(FMUL8x16AU, VIS1, do_ddd, a, gen_helper_fmul8x16au)
|
|
||||||
TRANS(FMUL8x16AL, VIS1, do_ddd, a, gen_helper_fmul8x16al)
|
|
||||||
TRANS(FMUL8SUx16, VIS1, do_ddd, a, gen_helper_fmul8sux16)
|
TRANS(FMUL8SUx16, VIS1, do_ddd, a, gen_helper_fmul8sux16)
|
||||||
TRANS(FMUL8ULx16, VIS1, do_ddd, a, gen_helper_fmul8ulx16)
|
TRANS(FMUL8ULx16, VIS1, do_ddd, a, gen_helper_fmul8ulx16)
|
||||||
TRANS(FMULD8SUx16, VIS1, do_ddd, a, gen_helper_fmuld8sux16)
|
|
||||||
TRANS(FMULD8ULx16, VIS1, do_ddd, a, gen_helper_fmuld8ulx16)
|
|
||||||
TRANS(FPMERGE, VIS1, do_ddd, a, gen_helper_fpmerge)
|
|
||||||
TRANS(FEXPAND, VIS1, do_ddd, a, gen_helper_fexpand)
|
|
||||||
|
|
||||||
TRANS(FPADD16, VIS1, do_ddd, a, tcg_gen_vec_add16_i64)
|
TRANS(FPADD16, VIS1, do_ddd, a, tcg_gen_vec_add16_i64)
|
||||||
TRANS(FPADD32, VIS1, do_ddd, a, tcg_gen_vec_add32_i64)
|
TRANS(FPADD32, VIS1, do_ddd, a, tcg_gen_vec_add32_i64)
|
||||||
|
@ -44,6 +44,7 @@ target_ulong helper_array8(target_ulong pixel_addr, target_ulong cubesize)
|
|||||||
|
|
||||||
#if HOST_BIG_ENDIAN
|
#if HOST_BIG_ENDIAN
|
||||||
#define VIS_B64(n) b[7 - (n)]
|
#define VIS_B64(n) b[7 - (n)]
|
||||||
|
#define VIS_SB64(n) sb[7 - (n)]
|
||||||
#define VIS_W64(n) w[3 - (n)]
|
#define VIS_W64(n) w[3 - (n)]
|
||||||
#define VIS_SW64(n) sw[3 - (n)]
|
#define VIS_SW64(n) sw[3 - (n)]
|
||||||
#define VIS_L64(n) l[1 - (n)]
|
#define VIS_L64(n) l[1 - (n)]
|
||||||
@ -51,6 +52,7 @@ target_ulong helper_array8(target_ulong pixel_addr, target_ulong cubesize)
|
|||||||
#define VIS_W32(n) w[1 - (n)]
|
#define VIS_W32(n) w[1 - (n)]
|
||||||
#else
|
#else
|
||||||
#define VIS_B64(n) b[n]
|
#define VIS_B64(n) b[n]
|
||||||
|
#define VIS_SB64(n) sb[n]
|
||||||
#define VIS_W64(n) w[n]
|
#define VIS_W64(n) w[n]
|
||||||
#define VIS_SW64(n) sw[n]
|
#define VIS_SW64(n) sw[n]
|
||||||
#define VIS_L64(n) l[n]
|
#define VIS_L64(n) l[n]
|
||||||
@ -60,6 +62,7 @@ target_ulong helper_array8(target_ulong pixel_addr, target_ulong cubesize)
|
|||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t b[8];
|
uint8_t b[8];
|
||||||
|
int8_t sb[8];
|
||||||
uint16_t w[4];
|
uint16_t w[4];
|
||||||
int16_t sw[4];
|
int16_t sw[4];
|
||||||
uint32_t l[2];
|
uint32_t l[2];
|
||||||
@ -74,94 +77,60 @@ typedef union {
|
|||||||
float32 f;
|
float32 f;
|
||||||
} VIS32;
|
} VIS32;
|
||||||
|
|
||||||
uint64_t helper_fpmerge(uint64_t src1, uint64_t src2)
|
uint64_t helper_fpmerge(uint32_t src1, uint32_t src2)
|
||||||
{
|
{
|
||||||
VIS64 s, d;
|
VIS32 s1, s2;
|
||||||
|
VIS64 d;
|
||||||
|
|
||||||
s.ll = src1;
|
s1.l = src1;
|
||||||
d.ll = src2;
|
s2.l = src2;
|
||||||
|
d.ll = 0;
|
||||||
|
|
||||||
/* Reverse calculation order to handle overlap */
|
d.VIS_B64(7) = s1.VIS_B32(3);
|
||||||
d.VIS_B64(7) = s.VIS_B64(3);
|
d.VIS_B64(6) = s2.VIS_B32(3);
|
||||||
d.VIS_B64(6) = d.VIS_B64(3);
|
d.VIS_B64(5) = s1.VIS_B32(2);
|
||||||
d.VIS_B64(5) = s.VIS_B64(2);
|
d.VIS_B64(4) = s2.VIS_B32(2);
|
||||||
d.VIS_B64(4) = d.VIS_B64(2);
|
d.VIS_B64(3) = s1.VIS_B32(1);
|
||||||
d.VIS_B64(3) = s.VIS_B64(1);
|
d.VIS_B64(2) = s2.VIS_B32(1);
|
||||||
d.VIS_B64(2) = d.VIS_B64(1);
|
d.VIS_B64(1) = s1.VIS_B32(0);
|
||||||
d.VIS_B64(1) = s.VIS_B64(0);
|
d.VIS_B64(0) = s2.VIS_B32(0);
|
||||||
/* d.VIS_B64(0) = d.VIS_B64(0); */
|
|
||||||
|
|
||||||
return d.ll;
|
return d.ll;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_fmul8x16(uint64_t src1, uint64_t src2)
|
static inline int do_ms16b(int x, int y)
|
||||||
{
|
{
|
||||||
VIS64 s, d;
|
return ((x * y) + 0x80) >> 8;
|
||||||
uint32_t tmp;
|
}
|
||||||
|
|
||||||
s.ll = src1;
|
uint64_t helper_fmul8x16(uint32_t src1, uint64_t src2)
|
||||||
|
{
|
||||||
|
VIS64 d;
|
||||||
|
VIS32 s;
|
||||||
|
|
||||||
|
s.l = src1;
|
||||||
d.ll = src2;
|
d.ll = src2;
|
||||||
|
|
||||||
#define PMUL(r) \
|
d.VIS_W64(0) = do_ms16b(s.VIS_B32(0), d.VIS_SW64(0));
|
||||||
tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r); \
|
d.VIS_W64(1) = do_ms16b(s.VIS_B32(1), d.VIS_SW64(1));
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
d.VIS_W64(2) = do_ms16b(s.VIS_B32(2), d.VIS_SW64(2));
|
||||||
tmp += 0x100; \
|
d.VIS_W64(3) = do_ms16b(s.VIS_B32(3), d.VIS_SW64(3));
|
||||||
} \
|
|
||||||
d.VIS_W64(r) = tmp >> 8;
|
|
||||||
|
|
||||||
PMUL(0);
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(2);
|
|
||||||
PMUL(3);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
return d.ll;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_fmul8x16al(uint64_t src1, uint64_t src2)
|
uint64_t helper_fmul8x16a(uint32_t src1, int32_t src2)
|
||||||
{
|
{
|
||||||
VIS64 s, d;
|
VIS32 s;
|
||||||
uint32_t tmp;
|
VIS64 d;
|
||||||
|
|
||||||
s.ll = src1;
|
s.l = src1;
|
||||||
d.ll = src2;
|
d.ll = 0;
|
||||||
|
|
||||||
#define PMUL(r) \
|
d.VIS_W64(0) = do_ms16b(s.VIS_B32(0), src2);
|
||||||
tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r); \
|
d.VIS_W64(1) = do_ms16b(s.VIS_B32(1), src2);
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
d.VIS_W64(2) = do_ms16b(s.VIS_B32(2), src2);
|
||||||
tmp += 0x100; \
|
d.VIS_W64(3) = do_ms16b(s.VIS_B32(3), src2);
|
||||||
} \
|
|
||||||
d.VIS_W64(r) = tmp >> 8;
|
|
||||||
|
|
||||||
PMUL(0);
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(2);
|
|
||||||
PMUL(3);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t helper_fmul8x16au(uint64_t src1, uint64_t src2)
|
|
||||||
{
|
|
||||||
VIS64 s, d;
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
s.ll = src1;
|
|
||||||
d.ll = src2;
|
|
||||||
|
|
||||||
#define PMUL(r) \
|
|
||||||
tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r); \
|
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
|
||||||
tmp += 0x100; \
|
|
||||||
} \
|
|
||||||
d.VIS_W64(r) = tmp >> 8;
|
|
||||||
|
|
||||||
PMUL(0);
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(2);
|
|
||||||
PMUL(3);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
return d.ll;
|
||||||
}
|
}
|
||||||
@ -169,23 +138,14 @@ uint64_t helper_fmul8x16au(uint64_t src1, uint64_t src2)
|
|||||||
uint64_t helper_fmul8sux16(uint64_t src1, uint64_t src2)
|
uint64_t helper_fmul8sux16(uint64_t src1, uint64_t src2)
|
||||||
{
|
{
|
||||||
VIS64 s, d;
|
VIS64 s, d;
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
s.ll = src1;
|
s.ll = src1;
|
||||||
d.ll = src2;
|
d.ll = src2;
|
||||||
|
|
||||||
#define PMUL(r) \
|
d.VIS_W64(0) = do_ms16b(s.VIS_SB64(1), d.VIS_SW64(0));
|
||||||
tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \
|
d.VIS_W64(1) = do_ms16b(s.VIS_SB64(3), d.VIS_SW64(1));
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
d.VIS_W64(2) = do_ms16b(s.VIS_SB64(5), d.VIS_SW64(2));
|
||||||
tmp += 0x100; \
|
d.VIS_W64(3) = do_ms16b(s.VIS_SB64(7), d.VIS_SW64(3));
|
||||||
} \
|
|
||||||
d.VIS_W64(r) = tmp >> 8;
|
|
||||||
|
|
||||||
PMUL(0);
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(2);
|
|
||||||
PMUL(3);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
return d.ll;
|
||||||
}
|
}
|
||||||
@ -193,80 +153,25 @@ uint64_t helper_fmul8sux16(uint64_t src1, uint64_t src2)
|
|||||||
uint64_t helper_fmul8ulx16(uint64_t src1, uint64_t src2)
|
uint64_t helper_fmul8ulx16(uint64_t src1, uint64_t src2)
|
||||||
{
|
{
|
||||||
VIS64 s, d;
|
VIS64 s, d;
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
s.ll = src1;
|
s.ll = src1;
|
||||||
d.ll = src2;
|
d.ll = src2;
|
||||||
|
|
||||||
#define PMUL(r) \
|
d.VIS_W64(0) = do_ms16b(s.VIS_B64(0), d.VIS_SW64(0));
|
||||||
tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \
|
d.VIS_W64(1) = do_ms16b(s.VIS_B64(2), d.VIS_SW64(1));
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
d.VIS_W64(2) = do_ms16b(s.VIS_B64(4), d.VIS_SW64(2));
|
||||||
tmp += 0x100; \
|
d.VIS_W64(3) = do_ms16b(s.VIS_B64(6), d.VIS_SW64(3));
|
||||||
} \
|
|
||||||
d.VIS_W64(r) = tmp >> 8;
|
|
||||||
|
|
||||||
PMUL(0);
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(2);
|
|
||||||
PMUL(3);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
return d.ll;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_fmuld8sux16(uint64_t src1, uint64_t src2)
|
uint64_t helper_fexpand(uint32_t src2)
|
||||||
{
|
|
||||||
VIS64 s, d;
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
s.ll = src1;
|
|
||||||
d.ll = src2;
|
|
||||||
|
|
||||||
#define PMUL(r) \
|
|
||||||
tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \
|
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
|
||||||
tmp += 0x100; \
|
|
||||||
} \
|
|
||||||
d.VIS_L64(r) = tmp;
|
|
||||||
|
|
||||||
/* Reverse calculation order to handle overlap */
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(0);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t helper_fmuld8ulx16(uint64_t src1, uint64_t src2)
|
|
||||||
{
|
|
||||||
VIS64 s, d;
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
s.ll = src1;
|
|
||||||
d.ll = src2;
|
|
||||||
|
|
||||||
#define PMUL(r) \
|
|
||||||
tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \
|
|
||||||
if ((tmp & 0xff) > 0x7f) { \
|
|
||||||
tmp += 0x100; \
|
|
||||||
} \
|
|
||||||
d.VIS_L64(r) = tmp;
|
|
||||||
|
|
||||||
/* Reverse calculation order to handle overlap */
|
|
||||||
PMUL(1);
|
|
||||||
PMUL(0);
|
|
||||||
#undef PMUL
|
|
||||||
|
|
||||||
return d.ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t helper_fexpand(uint64_t src1, uint64_t src2)
|
|
||||||
{
|
{
|
||||||
VIS32 s;
|
VIS32 s;
|
||||||
VIS64 d;
|
VIS64 d;
|
||||||
|
|
||||||
s.l = (uint32_t)src1;
|
s.l = src2;
|
||||||
d.ll = src2;
|
d.ll = 0;
|
||||||
d.VIS_W64(0) = s.VIS_B32(0) << 4;
|
d.VIS_W64(0) = s.VIS_B32(0) << 4;
|
||||||
d.VIS_W64(1) = s.VIS_B32(1) << 4;
|
d.VIS_W64(1) = s.VIS_B32(1) << 4;
|
||||||
d.VIS_W64(2) = s.VIS_B32(2) << 4;
|
d.VIS_W64(2) = s.VIS_B32(2) << 4;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user