Compare commits

..

3 Commits

Author SHA1 Message Date
Hugo Carvalho 10b41dfef0
Update Portuguese translation (#2412) 2024-03-07 21:13:58 +10:30
zilmar 98b1bddc64 Core: Get COP1_D_ADD, COP1_D_SUB, COP1_D_DIV, COP1_D_ABS, COP1_D_SQRT 2024-03-07 21:12:57 +10:30
zilmar 97ec1f533b Core: Make sure precision is set to 53bit 2024-03-07 20:52:24 +10:30
3 changed files with 293 additions and 164 deletions

View File

@ -1,19 +1,19 @@
// Meta information
#1 # "Português" // Language ID
#1 # "Português (Portugal)" // Language ID
#2 # "Hugo Carvalho" // Author
#3 # "3.0" // Version
#4 # "Novembro, 2022" // Date
#3 # "3.0.1" // Version
#4 # "06 de março de 2024" // Date
/*** Menu ***/
// File menu
#100# "&Ficheiro"
#101# "&Abrir a ROM"
#101# "&Abrir ROM"
#102# "Informação &da ROM..."
#103# "Iniciar a emulação"
#104# "&Terminar a emulação"
#103# "Iniciar emulação"
#104# "&Encerrar emulação"
#105# "Escolher o directório das ROMs..."
#106# "Actualizar a lista das ROMs"
#106# "Actualizar lista das ROMs"
#107# "ROMs recentes"
#108# "Directórios das ROMs recentes"
#109# "S&air"
@ -22,19 +22,19 @@
// System menu
#120# "&Sistema"
#121# "&Reiniciar"
#122# "&Colocar em pausa"
#122# "&Pausa"
#123# "Captura de ecrã"
#124# "Limitar o FPS"
#124# "Limitar FPS"
#125# "&Gravar"
#126# "Gravar como..."
#127# "&Carregar o estado"
#127# "&Carregar estado"
#128# "Carregar..."
#129# "Gravar o estado a&tual"
#129# "Gravar estado ac&tual"
#130# "&Batotas..."
#131# "Botão GS"
#132# "R&etomar"
#133# "&Reiniciar leve"
#134# "&Reiniciar forçado"
#133# "&Reinício leve"
#134# "&Reinício forçado"
#135# "Trocar &disco"
#136# "&Melhorias..."
@ -42,9 +42,9 @@
#140# "&Opções"
#141# "&Ecrã inteiro"
#142# "Sempre na &frente"
#143# "&Definições dos Gráficos"
#144# "&Definições do Áudio"
#145# "&Definições do Controlador"
#143# "&Definições dos gráficos"
#144# "&Definições do áudio"
#145# "&Definições do controlador"
#146# "&Definições do RSP"
#147# "Mostrar as estatísticas da &CPU"
#148# "Defini&ções..."
@ -58,7 +58,7 @@
// Help menu
#180# "&Ajuda"
#182# "&Acerca do Project 64"
#184# "&Site da Web"
#184# "&Página da Web"
#185# "&Apoiar o Project64"
#186# "&Discord"
@ -74,14 +74,14 @@
#198# "Compartimento 8"
#199# "Compartimento 9"
#200# "Compartimento 10"
#201# "Compartimento de gravação (%ws) seleccionado"
#201# "Compartimento (%ws) seleccionado"
// Pop-up menu
#210# "Jogar o jogo"
#211# "Informação da ROM"
#212# "Editar as definições do jogo"
#213# "Editar as batotas..."
#214# "Plugin dos Gráficos"
#211# "Informações da ROM"
#212# "Editar definições do jogo"
#213# "Editar batotas..."
#214# "Plugin de gráficos"
#215# "Jogar o jogo com o disco"
#216# "Escolher melhorias..."
@ -100,18 +100,18 @@
// Menu descriptions
#250# "Abrir uma imagem ROM do N64"
#251# "Mostrar informação sobre a imagem carregada"
#252# "Iniciar a emulação da imagem ROM carregada"
#253# "Parar a emulação da imagem ROM carregada"
#251# "Mostrar informações sobre a imagem carregada"
#252# "Iniciar emulação da imagem ROM carregada"
#253# "Parar emulação da imagem ROM carregada"
#254# "Seleccionar o directório das ROMs"
#255# "Actualizar a lista das ROMs actuais no explorador de ROMs"
#256# "Sair desta aplicação"
#257# "Reiniciar a imagem ROM actual (recarregar quaisquer alterações nas definições)"
#255# "Actualizar a lista actual das ROMs no explorador de ROMs"
#256# "Sair da aplicação"
#257# "Reiniciar imagem da ROM actual (recarregar quaisquer alterações nas definições)"
#258# "Interromper/retomar a emulação da ROM actual em execução"
#259# "Gerar uma imagem bitmap do ecrã actual"
#260# "Limitar o FPS para a velocidade correta do N64"
#261# "Gravar o estado do sistema actual"
#262# "Gravar o estado do sistema actual num local seleccionado para o ficheiro"
#261# "Gravar o estado actual do sistema"
#262# "Gravar o estado actual do sistema num local seleccionado para o ficheiro"
#263# "Carregar o estado gravado do sistema"
#264# "Escolher um ficheiro do estado gravado do sistema para carregar"
#265# "Activar/Desactivar as batotas do Gameshark"
@ -125,15 +125,15 @@
#273# "Mostrar a utilização da CPU pelo emulador dividida sobre recursos diferentes"
#274# "Visualizar/Alterar as definições para esta aplicação"
#275# "Visualizar o manual da aplicação"
#276# "Visualizar as FAQ da aplicação"
#278# "Acerca da aplicação e autores"
#276# "Visualizar as perguntas frequentes da aplicação"
#278# "Acerca da aplicação e dos autores"
#277# "Acerca dos autores dos ficheiros de suporte"
#279# "Abrir esta imagem ROM previamente aberta"
#280# "Escolher este directório como directório das ROMs"
#281# "Alterar a aplicação para usar este idioma"
#282# "Escolha este local de gravação para o estado gravado"
#283# "Jogar o jogo seleccionado"
#284# "Informação sobre o jogo seleccionado"
#284# "Informações sobre o jogo seleccionado"
#285# "Editar as definições do jogo seleccionado"
#286# "Editar as batotas do jogo seleccionado"
@ -145,7 +145,7 @@
#302# "Boa reputação"
#303# "Estado"
#304# "Tamanho da ROM"
#305# "Notas (core)"
#305# "Notas (núcleo)"
#306# "Notas (plugins predefinidos)"
#307# "Notas (utilizador)"
#308# "ID do cartucho"
@ -158,7 +158,7 @@
#315# "Data de lançamento"
#316# "Género"
#317# "Jogadores"
#318# "Forçar o Feedback"
#318# "Forçar Feedback"
#319# "Formato do ficheiro"
#321# "Nome"
@ -166,7 +166,7 @@
#320# "Seleccionar o directório actual das ROMs"
// Messages
#340# "Má ROM? Usar o GoodN64 e verificar se a RDB está actualizada"
#340# "ROM corrompida? Use o GoodN64 e verifique se o RDB está actualizado"
/*** Options ***/
@ -184,19 +184,19 @@
#409# "Teclas de atalho"
#410# "Estado"
#411# "Recompilador"
#412# "Padrões"
#412# "Predefinições"
#413# "64DD"
#414# "64DD"
// Plugin dialog
#420# "Acerca"
#421# " Plugin RSP (Processador do Sinal da Realidade): "
#422# " Plugin de Vídeo (gráficos): "
#423# " Plugin de Áudio (som): "
#424# " Plugin do Controlador (controlador): "
#422# " Plugin de vídeo (gráficos): "
#423# " Plugin de áudio (som): "
#424# " Plugin de entrada (controlador): "
#425# "Gráficos HLE"
#426# "Áudio HLE"
#427# "** Usar o Plugin do Sistema **"
#427# "** Usar plugin do sistema **"
// Directory dialog
#440# " Directório dos plugins: "
@ -216,26 +216,26 @@
// Options (general) tab
#460# "Interromper a emulação quando a janela não está activa"
#461# "Entrar no modo de ecrã inteiro quando carregar uma ROM"
#462# "Ocultar as definições avançadas"
#463# "Memorizar as batotas seleccionadas"
#464# "Desactivar a protecção de ecrã quando executar uma ROM"
#465# "Mostrar a velocidade"
#466# "Visor da velocidade:"
#462# "Ocultar definições avançadas"
#463# "Memorizar batotas seleccionadas"
#464# "Desactivar protecção de ecrã quando executar uma ROM"
#465# "Mostrar velocidade"
#466# "Velocidade do ecrã:"
#467# "Verificar se o Project64 já está em execução"
#468# "Armazenar gravações do jogo em pastas separadas"
#469# "Local da ROM 64DD IPL de retalho Japão:"
#470# "Local da ROM 64DD IPL de retalho América:"
#471# "Local da ROM 64DD IPL de desenvolvimento:"
#472# "Tipo de gravação:"
#469# "Localização da ROM 64DD IPL de retalho Japão:"
#470# "Localização da ROM 64DD IPL de retalho América:"
#471# "Localização da ROM 64DD IPL de desenvolvimento:"
#472# "Tipo de gravação no disco:"
#473# "Activar melhorias"
#474# "Mostrar barra de estado"
#475# "Sair do ecrã inteiro ao perder o foco"
#476# "Activar Discord Rich Presence"
#476# "Activar Rich Presence do Discord"
// ROM browser tab
#480# "Máx. # de ROMs memorizadas (0-10):"
#480# "Nº máximo # de ROMs memorizadas (0-10):"
#481# "ROMs"
#482# "Máx. # de dirs ROMs memorizados (0-10):"
#482# "Nº máximo # de directórios de ROMs memorizados (0-10):"
#483# "Directórios"
#484# "Usar explorador de ROMs"
#485# "Usar repetição de directório"
@ -243,21 +243,21 @@
#487# "Ordem dos campos:"
#488# "Adicionar ->"
#489# "<- Remover"
#490# "Acima"
#491# "Abaixo"
#490# "P/ cima"
#491# "P/ baixo"
#492# "Recarregar o explorador automaticamente"
#493# "Mostrar extensão dos ficheiros"
// Advanced options
#500# "A maioria destas alterações não terão efeito até que uma nova ROM seja aberta ou que a ROM actual seja reposta."
#501# "Padrões do core"
#502# "Estilo do core da CPU:"
#503# "Métodos de auto-modificação"
#501# "Predefinições do núcleo"
#502# "Estilo do núcleo da CPU:"
#503# "Métodos de modificação automática"
#504# "Tamanho predefinido da memória:"
#505# "Ligação avançada de blocos"
#506# "Iniciar a emulação quando a ROM está aberta"
#505# "Ligação avançada dos blocos"
#506# "Iniciar a emulação quando a ROM for aberta"
#507# "Substituir sempre as definições predefinidas com as do RDB"
#508# "Comprimir automaticamente os estados gravados"
#508# "Comprimir os estados gravados automaticamente"
#509# "Activar depurador"
#510# "Cache"
#511# "DMA do PI"
@ -274,9 +274,9 @@
#524# "Tipo da gravação predefinida:"
#525# "Contrafator:"
#526# "Buffer de compilação maior"
#528# "Caching de registo"
#528# "Registar armazenamento em cache"
#529# "Atrasar a interrupção do SI"
#530# "SP Rápido"
#530# "SP rápido"
#531# "Predefinido"
#532# "Sinal de áudio do RSP"
#533# "Temporização do áudio fixo"
@ -284,14 +284,17 @@
#535# "Método de auto-modificação personalizado"
#536# "Sincronizar usando o áudio"
#537# "Contagem de AIs por byte:"
#538# "Engine de 32 bits"
#538# "Mecanismo de 32 bits"
#539# "Atrasar a interrupção do DP"
#5400# "Modificador overclock:"
#5400# "Modificador de overclock:"
#5410# "DMA desalinhado"
#5420# "Aleatorizar as interrupções SI/PI"
#5440# "Tempo de busca em disco:"
#5440# "Tempo de busca no disco:"
#5441# "Turbo"
#5442# "Lento"
#5443# "Tamanho da memória (conhecido):"
#5444# "Tamanho da memória (desconhecido):"
#5445# "Cache do registo do FPU"
// Core styles
#540# "Interpretador"
@ -301,11 +304,11 @@
// Self-mod methods
#560# "Nenhum"
#561# "Cache"
#562# "Proteger a memória"
#563# "Verificar a memória e cache"
#564# "Alterar a memória e cache"
#565# "Verificar o avanço da memória"
#566# "Limpar o código no cache"
#562# "Proteger memória"
#563# "Verificar memória e cache"
#564# "Alterar memória e cache"
#565# "Verificar avanço da memória"
#566# "Limpar código no cache"
// Function lookup method
#570# "Tabela de procura física"
@ -313,8 +316,8 @@
#572# "Alterar memória"
// RDRAM size
#580# "4 MBs"
#581# "8 MBs"
#580# "4 MB"
#581# "8 MB"
// Advanced block linking
#600# "Ligado"
@ -338,7 +341,7 @@
#682# "Teclas actuais:"
#683# "Seleccionar nova tecla de atalho:"
#684# "Actualmente atribuído a:"
#685# "Designar"
#685# "Atribuir"
#686# "Remover"
#687# "Repor tudo"
#688# "O jogo não está em execução"
@ -369,7 +372,7 @@
/*** ROM information ***/
// ROM info title
#800# "Informação da ROM"
#800# "Informações da ROM"
// ROM info text
#801# "Nome da ROM:"
@ -410,7 +413,7 @@
// Digital value
#1016# "Dígito da quantidade"
#1017# "Escolha um valor pra:"
#1017# "Escolha um valor para:"
#1018# "&Valor"
#1019# "de"
#1020# "até"
@ -422,9 +425,9 @@
#1026# "<valor> <rótulo>"
// Edit cheat
#1027# "Editar a batota"
#1028# "Actualizar a batota"
#1029# "A batota foi alterada.\n\nDeseja actualizar?"
#1027# "Editar batota"
#1028# "Actualizar batota"
#1029# "A batota foi alterada.\n\nPretende actualizar?"
#1030# "Batota actualizada"
// Cheat pop-up menu
@ -451,12 +454,12 @@
#1206# "Falha ao validar o código\n\nCertifique-se de que o código no e-mail corresponde com base no seu dispositivo"
#1207# "Obrigado"
#1208# "Insira o código de apoio"
#1209# "Insira o código que recebeu no e-mail.\n\nEste e-mail será enviado para o endereço de e-mail usado para apoiar o Project64.\n\nNote-se que o código só funcionará para um único dispositivo. A identificação deste dispositivo é:"
#1209# "Insira o código recebido por e-mail.\n\nEste e-mail será enviado para o endereço de e-mail usado para apoiar o Project64.\n\nNote que o código só funcionará para um único dispositivo. A identificação deste dispositivo é:"
#1210# "Aceitar"
#1211# "Cancelar"
#1212# "Requisitar código"
#1212# "Solicitar código"
#1213# "O código foi enviado para o seu e-mail"
#1214# "Falha no envio do código, certifique-se de que é o e-mail com o qual apoiou"
#1214# "Falha ao enviar o código. Certifique-se de que o e-mail está correcto"
/*** Enhancements ***/
@ -466,8 +469,8 @@
#2000# "*** CPU EM PAUSA ***"
#2001# "CPU retomada"
#2002# "Num ciclo permanente do qual não se pode sair.\nA emulação vai agora parar.\n\nVerifique a ROM e as suas definições."
#2003# "Falha na atribuição de memória"
#2002# "Num ciclo permanente do qual não se pode sair.\nA emulação será interrompida agora.\n\nVerifique a ROM e as suas definições."
#2003# "Falha ao atribuir a memória"
#2004# "O plugin de vídeo predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de vídeo (gráficos).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
#2005# "O plugin de áudio predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de áudio (som).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
#2006# "O plugin RSP predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin RSP (Processador do Sinal de Realidade).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
@ -476,7 +479,7 @@
#2009# "Falha ao carregar a palavra.\n\Verifique a ROM e as suas definições."
#2010# "Falha ao abrir o ficheiro gravado"
#2011# "Falha ao abrir o EEPROM"
#2012# "Falha ao abrir a flash RAM"
#2012# "Falha ao abrir a RAM do flash"
#2013# "Falha ao abrir o mempak"
#2014# "Falha ao tentar abrir o ficheiro zip.\n\nProvavelmente um ficheiro zip corrompido - tente descomprimir a ROM manualmente."
#2015# "Falha ao tentar abrir o ficheiro."
@ -492,13 +495,13 @@
#2025# "Erro"
#2026# "Sequência de direitos de autor não encontrada no LUT. O jogo deixará de funcionar."
#2027# "Falha na protecção contra cópia"
#2028# "Mudar um plugin requer que o Project64 reinicie uma ROM em execução.\nSe não quer perder o local responda Não e grave primeiro o estado actual.\n\nMudar os plugins e reiniciar a ROM agora?"
#2029# "Mudar os plugins"
#2030# "Emulação terminada"
#2028# "Alterar um plugin requer que o Project64 reinicie uma ROM em execução.\nSe não quer perder o local responda Não e grave primeiro o estado actual.\n\nMudar os plugins e reiniciar a ROM agora?"
#2029# "Alterar plugins"
#2030# "Emulação encerrada"
#2031# "Emulação iniciada"
#2032# "Não foi possível carregar o estado"
#2033# "Estado carregado"
#2034# "Gravou o estado actual em"
#2034# "Estado actual gravado em"
#2035# "Compartimento do estado"
#2036# "Imagem da troca dos bytes"
#2037# "A escolher a imagem do N64"
@ -508,67 +511,71 @@
#2041# "Eliminar isto?"
#2042# "Eliminar batota"
#2043# "O nome da batota já está em utilização."
#2044# "Alcançou a quantia máxima de batotas para esta ROM."
#2044# "Alcançou o número máximo de batotas para esta ROM."
#2045# "Plugin a iniciar"
#2046# "Não seleccionou uma tecla virtual para designar ao item do menu."
#2047# "É necessário seleccionar um item do menu para atribuir a esta tecla"
#2048# "O atalho foi designado a outro item do menu."
#2049# "Nenhum atalho foi seleccionado para ser removido."
#2050# "ROM carregada. À espera que a emulação inicie."
#2051# "As versões beta do Project64 são só pra membros.\n\nSe tem uma conta em www.pj64-emu.com não deveria estar a ver este erro!!\nContacte-nos no site."
#2050# "ROM carregada. A aguardar que a emulação inicie."
#2051# "As versões beta do Project64 são só para membros.\n\nSe tem uma conta em www.pj64-emu.com não deveria estar a ver este erro!!\nContacte-nos no site."
#2052# "Erro do programa"
#2053# "Falha ao localizar o nome do ficheiro no ficheiro 7z"
#2054# "Emulação gráfica de baixo nível"
#2055# "Os Gráficos LLE não são para o uso geral!!!\nÉ aconselhável que só o utilize para testes e não para jogar jogos.\n\nMudar pra gráficos LLE?"
#2055# "Os Gráficos LLE não são para o uso geral!!!\nÉ aconselhável que só o utilize para testes e não para jogar jogos.\n\nAlterar para gráficos LLE?"
#2056# "Emulação áudio de alto nível"
#2057# "O Áudio HLE requer um plugin de terceiros!!!\nSe não tem um plugin de áudio de terceiros que suporta HLE não irá ouvir o som.\n\nMudar para áudio HLE?"
#2057# "O Áudio HLE requer um plugin de terceiros!!!\nSe não tem um plugin de áudio de terceiros que suporta HLE não irá ouvir o som.\n\nAlterar para áudio HLE?"
#2058# "O ficheiro carregado não parece ser uma ROM IPL válida do 64DD.\n\nVerifique as ROMs com o GoodN64."
#2059# "Nintendo 64DD ROM IPL Japonesa de retalho não encontrada.\nÉ requerido para jogar imagens de disco da região japonesa do 64DD.\n\nSeleccione a ROM requerida nas Definições."
#2061# "Nintendo 64DD ROM IPL Americana de retalho não encontrada.\nÉ requerido para jogar imagens de disco da região americana do 64DD.\n\nSeleccione a ROM requerida nas Definições."
#2062# "Nintendo 64DD ROM IPL De desenvolvimento não encontrada.\nÉ requerido jogar imagens de disco do 64DD de desenvolvimento.\n\nSeleccione a ROM requerida nas Definições."
#2063# "Falha ao actualizar a batota, é inválida"
#2059# "Nintendo 64DD ROM IPL Japonesa de retalho não localizada.\nÉ necessário para jogar imagens de disco da região japonesa do 64DD.\n\nSeleccione a ROM requerida nas Definições."
#2061# "Nintendo 64DD ROM IPL Americana de retalho não localizada.\nÉ necessário para jogar imagens de disco da região americana do 64DD.\n\nSeleccione a ROM exigida nas Definições."
#2062# "Nintendo 64DD ROM IPL De desenvolvimento não localizada.\nÉ necessário para jogar imagens de disco do 64DD de desenvolvimento.\n\nSeleccione a ROM exigida nas Definições."
#2063# "Falha ao actualizar a batota, a mesma é inválida"
#2064# "Batota inválida"
#2065# "Não foi possível ler os bytes de identificação"
#2066# "O ficheiro de imagem é inválido"
#2067# "Não foi possível atribuir espaço para a ROM"
#2068# "Não foi possível abrir a ROM"
/*** Android ***/
#3000# "Definições"
#3001# "Ajuda/Fórum"
#3002# "Relatar problema"
#3002# "Comunicar problema"
#3003# "Acerca"
#3004# "Jogou recentemente"
#3005# "Jogos"
#3006# "Directório do jogo"
#3007# "Seleccione uma pasta para analisar"
#3007# "Seleccione uma pasta para examinar"
#3008# "Incluir sub-directórios"
#3009# "Pasta principal"
#3010# "Directórios"
#3011# "Memória interna"
#3012# "A analisar..."
#3012# "A examinar..."
#3013# "Aceitar"
#3014# "Cancelar"
#3015# "Informação"
#3016# "Project64 do Android"
#3016# "Project64 para Android"
#3017# "Licença"
#3018# "Revisão"
#3019# "O Project64 do Android\u2122 é um transporte da versão do windows do Project64. A versão do Android\u2122 consegue executar a maioria dos jogos do N64."
#3019# "O Project64 para Android\u2122 é uma portabilidade da versão para Windows do Project64. A versão para Android\u2122 pode executar a maioria dos jogos do N64."
#3020# "Autores do Project64."
#3021# "Discord"
// In-game menu
#3100# "Definições"
#3101# "Gravar o estado"
#3102# "Carregar o estado"
#3103# "Terminar a emulação"
#3104# "Colocar em pausa"
#3101# "Gravar estado"
#3102# "Carregar estado"
#3103# "Encerrar emulação"
#3104# "Pausa"
#3105# "Retomar"
#3106# "Velocidade do jogo"
#3107# "Gravar o estado actual..."
#3107# "Estado da gravação actual..."
#3108# "Automático"
#3109# "Compartimento"
#3110# "Repor"
#3111# "Opções de depuração"
#3112# "Repor os tempos da função"
#3113# "Esvaziar os tempos da função"
#3112# "Repor tempos da função"
#3113# "Esvaziar tempos da função"
// Video plugin
#3200# "Nativo"

View File

@ -8297,6 +8297,31 @@ void CX86RecompilerOps::COP1_D_ADD()
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
if (FpuExceptionInRecompiler())
{
CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
@ -8313,12 +8338,38 @@ void CX86RecompilerOps::COP1_D_ADD()
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
}
}
}
void CX86RecompilerOps::COP1_D_SUB()
{
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
if (FpuExceptionInRecompiler())
{
CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
if (m_Opcode.fd == m_Opcode.ft)
@ -8347,6 +8398,7 @@ void CX86RecompilerOps::COP1_D_SUB()
}
}
}
}
void CX86RecompilerOps::COP1_D_MUL()
{
@ -8402,6 +8454,31 @@ void CX86RecompilerOps::COP1_D_DIV()
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
if (FpuExceptionInRecompiler())
{
CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
if (m_Opcode.fd == m_Opcode.ft)
@ -8429,13 +8506,35 @@ void CX86RecompilerOps::COP1_D_DIV()
}
}
}
}
void CX86RecompilerOps::COP1_D_ABS()
{
if (FpuExceptionInRecompiler())
{
CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fabs();
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fabs();
}
}
void CX86RecompilerOps::COP1_D_NEG()
{
@ -8445,11 +8544,32 @@ void CX86RecompilerOps::COP1_D_NEG()
}
void CX86RecompilerOps::COP1_D_SQRT()
{
if (FpuExceptionInRecompiler())
{
CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fsqrt();
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fsqrt();
}
}
void CX86RecompilerOps::COP1_D_MOV()
{

View File

@ -287,22 +287,24 @@ void CX86RegInfo::FixRoundModel(FPU_ROUND RoundMethod)
m_Assembler.fpuStoreControl(&m_fpuControl, "m_fpuControl");
asmjit::x86::Gp reg = Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(reg, &m_fpuControl, "m_fpuControl");
m_Assembler.and_(reg, 0xF3FF);
m_Assembler.and_(reg, 0xF0FF);
uint16_t Precision = 0x200;
if (RoundMethod == RoundDefault)
{
asmjit::x86::Gp RoundReg = Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.OrVariableToX86Reg(reg, &CX86RecompilerOps::m_RoundingModeValue, "m_RoundingModeValue");
m_Assembler.or_(reg, Precision);
SetX86Protected(GetIndexFromX86Reg(RoundReg), false);
}
else
{
switch (RoundMethod)
{
case RoundTruncate: m_Assembler.or_(reg, 0x0C00); break;
case RoundNearest: m_Assembler.or_(reg, 0x0000); break;
case RoundDown: m_Assembler.or_(reg, 0x0400); break;
case RoundUp: m_Assembler.or_(reg, 0x0800); break;
case RoundTruncate: m_Assembler.or_(reg, 0x0C00 | Precision); break;
case RoundNearest: m_Assembler.or_(reg, 0x0000 | Precision); break;
case RoundDown: m_Assembler.or_(reg, 0x0400 | Precision); break;
case RoundUp: m_Assembler.or_(reg, 0x0800 | Precision); break;
default:
g_Notify->DisplayError("Unknown rounding model");
}