|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Dopo aver hexpumpato (?) il long double -1.0 dal C e aver ottenuto questo schifo:
Codice:
sizeof(long double) 12 -1 as long double '0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xff 0xbf 0x00 0x00 ' sizeof(double) 8 -1 as double '0x00 0x00 0x00 0x00 0x00 0x00 0xf0 0xbf ' Codice:
FP7 ST0(v): raw 0xbfff:8000000000000000 (-1,0000000000) (NORMAL) Quindi la costante è errata ed è per questo che non va una mazza? E soprattutto è giusto avere l'FPU a 80 Bit o è meglio averla settata come 64 bit (così da evitare continue conversioni?). Anche la Microsoft non sembra convinta: Quote:
non posso settare la FPU a 64 Bit alla partenza e dimenticarmene? Sarebbe più lenta? Padda gli altri 4 byte con 0 ogni volta? A questo solo il nostro insider Intel può rispondere mi sa ![]()
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
|
![]() |
![]() |
![]() |
#22 | ||||||||||||||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Adesso non ho tempo né testa (il post-partita è, diciamo, un po' traumatico ![]() Riguardo alla costante caricata nello stack e nel registro ST0, sei sicuro che Bochs ti mostri una rappresentazione corretta? Quote:
La causa dev'essere un'altra. Quote:
![]() Quote:
Quote:
Comunque non vi fossilizzate con processore = versione minima per avere alcune estensioni, perché un processo moderno può benissimo implementare una vecchia ISA per particolari esigenze, come dimostra Galileo. Quote:
Non vi sbarazzerete così facilmente del legacy. ![]() E comunque, dati i vostri obiettivi, è giusto che sia così. Quote:
![]() Quote:
Quote:
Quote:
Comunque C# è un gran, ottimo compromesso, e per quanto mi riguarda fate benissimo a portare avanti Cosmos Quote:
Altrimenti così perdete troppo tempo andando a caccia di bug come questi. Quote:
Dopodiché potreste ricompilare l'applicazione x86 in qualunque architettura. ![]() Quote:
![]() ![]() Quote:
Quote:
![]() Quote:
Quote:
![]() Quote:
Quote:
Quote:
Però mi pare che abbia delle istruzioni di FADD e FMUL che vengono eseguite a precisione inferiore a quella estesa, ma che sono più veloci. Solo che al momento non posso verificare. Quote:
![]() EDIT: per parlare in generale di Cosmos, ti consiglio di aprire un apposito thread. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||||||||||||||||
![]() |
![]() |
![]() |
#23 | ||||||||||||||||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
![]() Quote:
Quote:
![]() Quote:
![]() Quote:
Quote:
![]() Se in futuro saprà in di eseguire script in C# o meglio ancora VB.NET potrò dire di aver riprodotto l'esperienza quasi totalmente ![]() Quote:
Come puoi vedere nel caso di float / double sono ora usate le istruzione SSE (prima venivano usate solo per i float e a me questo ha rotto l'armonia ![]() ![]()
Per esempio un ipotetica SSE.Add() diventerebbe: Codice:
static void Add() XS.SSE2.MoveSD(XMM0, ESP, sourceIsIndirect: true); // Move the stack of 8 bytes to get the second double XS.Add(ESP, 8); XS.SSE2.MoveSD(XMM1, ESP, sourceIsIndirect: true); XS.SSE2.AddSD(XMM1, XMM0); XS.SSE2.MoveSD(ESP, XMM1, destinationIsIndirect: true);{ } Quote:
Quote:
Quote:
Quote:
Anche la classe String è piena di P/Invoke! Cosmos è nato prima che la Microsoft iniziasse a mettere .NET su GitHub e pensasse seriamente a renderlo portabile, probabilmente usare Core.Rt semplificherebbe le cose, ma vorrebbe dire ricominciare da capo! Quote:
Quote:
Quote:
Il boot è molto veloce (ed è integrato nel tasto "run" di Visual Studio) forse potrebbe aver senso scrivere il codice NASM e compilarlo "altrove", ma non sono poi come stampare il valore ottenuto ![]() Quote:
Vedi io seguivo Haiku (clone di BeOS) ed era un bel progetto ben impostato, con un kernel scritto in C++ ecc... Poi venne il "problema" di come portare applicazioni Open Source su Haiku la cui alberatura delle directory rispetto Unix / Linux aveva pure senso, prendendo ad esempio sempre Pyton vuole scrivere la configurazione in /etc mentre in Haiku andrebbe in /Sytem/cfg... Beh invece di fare il porting "corretto" hanno creato un package manager (il diavolo!) con un filesystem virtuale in modo che Python creda di scrivere in /etc mentre invece scrive su una specie di "immagine". Follia pura! Sono passati 3 anni e sono ancora lì a smenarsela col package manager e peggio ancora hanno perso la retro-compatibilità con BeOS: l'obiettivo per cui Haiku fu fatto. Per me meglio riscriversi tutto che farsi "imporre" le scelte di GNU... Quote:
Sì sono solo in dubbio se aprirlo in sezione Sistemi Operativi o qui in programmazione...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 28-06-2016 alle 09:48. |
||||||||||||||||
![]() |
![]() |
![]() |
#24 | ||||||||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
"The precision-control (PC) field (bits 8 and 9 of the x87 FPU control word) determines the precision (64, 53, or 24 bits) of floating-point calculations made by the x87 FPU (see Table 8-2). The default precision is double extended precision, which uses the full 64-bit significand available with the double extended-precision floating-point format of the x87 FPU data registers. This setting is best suited for most applications, because it allows applications to take full advantage of the maximum precision available with the x87 FPU data registers.Quindi butti soltanto via una cosa che è utilissima: lavorare a precisione più elevata di quanto fanno le altre FPU. Quote:
Quote:
Quote:
Quote:
Quote:
Vedrai quanto sarà elegante quando userete il polimorfismo per gestire i backend. ![]() Quote:
Quote:
Quote:
Quote:
Quote:
Niente NASM dunque, visto che rimarrebbe tutto in C#, e con la possibilità di eseguire il codice generato dal vostro IL in una sandbox e leggerne i risultati. Quote:
Comunque, sì: non avreste codice nativo Cosmos, ma d'altra parte Cosmos è basato su IL, e quest'ultimo potrebbe provenire da qualunque fonte. ![]() Quote:
![]() Quote:
Quote:
Al più in s.o. aprite thread su discorsi generici, sulle caratteristiche che dovrebbe avere un s.o. a livello più astratto.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||||||||||
![]() |
![]() |
![]() |
#25 | ||||||||||||||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
Quote:
Comunque il problema è che .NET essendo nato su x86 e forse per essere il più generici possibile internamente non opera con double, ma con un tipo chiamato F che può usere double, long double o anche (che sarebbe meglio) quad (128 bit floating point) quindi dovremmo creare un tipo F nel nostro compilatore (attualmente trattiamo double come fossero long / int64) e qual punto cadrebbe un po' il senso di aver usato SSE visto che SSE non accetta in input i FP a 80 bit saremmo sempre a fare: 1. Carica da ESP il FP di 80 bit 2. Convertilo in double e rimettilo su ESP 3. Ora fai le operazioni con SSE Uno a questo punto potrebbe dire giustamente la FPU sarà più lenta delle SSE, ma fare tutti sti "giri" si mangia il vantaggio! Usiamo la FPU per fare tutto e via... Quote:
Quote:
Altra prova che ho fatto ieri invece di passargli direttamente [valore] ho creato una label e ho fatto [valore] beh alla fine delle operazioni in ST0 c'era [valore] non la somma tra -1.0 e [valore]. Sto letteralmente impazzendo ![]() Quote:
Una cosa che volevo tentare era di scrivere la costante dentro st1 e fare la somma tra st0 e st1 così anche la constante sarebbe stata in un registro, ma anche non è possibile NASM non accetta l'istruzione: fild st1, qword [costante] dice che gli operandi sono sbagliati! Quote:
Gli if soprattutto con i sotto if per i float non mi piacciono nemmeno a me, io avrei fatto uno switch sui tipi, tanto C# non è come il C dove lo switch non funziona quasi mai... fosse per me if / else if / else if /else non dovrebbero nemmeno esistere. Quote:
Quote:
Quote:
![]() Quote:
Forse in futuro lo faremo, chi lo sa... tanto prima bisogna che la Microsoft renda pronto per la produzione lo stesso CoreRt, quindi... Ci sono classi comunque che andranno sempre pluggate per esempio Console scrive direttamente sulla porta della VGA i caratteri (sì non c'è nessun context switch tra user mode e kernel mode: non esiste l'user mode ![]() Non proprio leggi il blog di Joe Duffy su Midori: tanto per iniziare il compilatore faceva stack escape analisys e si permetteva di allocare oggetti nello stack cosa che nemmeno C++/CLI ha mai osato fare (finge soltanto usa l'heap come fosse uno stack)! Poi hanno esteso la sintassi per passare oggetti come rifermento (non ho ben capito quella parte), introdussero async con una sintassi diverso dal C# normale (ma Midori l'aveva prima, C# l'ha fatta dopo ed è pure più inefficiente!)... Quote:
https://github.com/CosmosOS/Cosmos/t...iler.Tests.Bcl dentro double.cs ci sono le operazioni sui double se usassimo il .NET runtime beh testeremmo quello: è ovvio che il vero C# sa convertire un ulong in double ![]() Comunque venendo da Linux lavorare su questo progetto è per me qualcosa di rivoluzionario! Cose che per voi magari saranno banali a me mi fanno rizzare i peli sulle braccia: Visual Studio che prevede il codice prima che abbia finito di scriverlo, che capisce che NON compilerà senza manco compilarlo (X# non so come sia possibile ma ha iniziato ad indicarmi che stavo sbagliando! "Volevi dire <destinationIndirect>? Non può essere <sourceIndirect> perché...), le unit test e soprattutto AppVoyer! Quote:
Certo come dovremo per esempio quando faremo il browser convertire javascript in IL a runtime potremmo farlo anche per x86, ma non lo so credo non lo faremo per motivi "politici". Quote:
E dire che c'era una soluzione migliore da cui prendere esempio i bundle di Apple e invece cosa vanno a copiare? Il package manager di Linux! Che poi - sarò strano io - ma cosa c'è di male a scaricare un installer dal sito del produttore e installarlo? Boh mai capito... Quote:
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 29-06-2016 alle 10:31. |
||||||||||||||
![]() |
![]() |
![]() |
#26 | |||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Non ti preoccupare di questo, ma se puoi usare la precisione massima senza intaccare le prestazioni, approfittane. Quote:
extended dovrebbe essere usato soltanto se il programmatore l'ha appositamente selezionato, oppure implicitamente & internamente nel caso in cui fosse disponibile soltanto l'FPU x87. Quote:
Quote:
![]() Quote:
![]() ![]() Quote:
Quote:
![]() ![]() Quote:
Il tutto fino a mappare l'intero codice in IL, e a questo punto si potrebbe anche andare di compilazione AoT in un colpo solo, togliendo di mezzo il runtime/JITter. Quote:
L'architettura al momento lasciala perdere, perché riguarda il JITter. Quote:
Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||||||||||
![]() |
![]() |
![]() |
#27 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Ma ancora la FADD non "FADDa"?
Deve esserci qualcosa che non quadra: un'istruzione che viene eseguita dalla CPU ma che, contemporaneamente, non viene eseguita. Questa è una rivoluzione ![]() |
![]() |
![]() |
![]() |
#28 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Ho fatto un'ulteriore prova:
Codice:
// Save the high part of the ulong in EAX (we cannot move all of ESP as it has 64 bit size) XS.Set(EAX, ESP, sourceIsIndirect: true, sourceDisplacement: 4); XS.FPU.IntLoad(ESP, isIndirect: true, size: RegisterSize.Long64); XS.Test(EAX, EAX); XS.Jump(ConditionalTestEnum.NotSign, LabelSign_Bit_Unset); XS.Set(ECX, 0x5F800000); XS.FPU.IntLoad(ECX, isIndirect: true, size: RegisterSize.Long64); XS.LiteralCode(@"fadd st1"); XS.Label(LabelSign_Bit_Unset); XS.FPU.FloatStoreAndPop(ESP, isIndirect: true, size: RegisterSize.Long64); 1. 'fild' non accetta un valore come sorgente, ma solo memoria ecco perché scrivo su ECX e poi da lì sulla FPU 2. 'fild' non accetta un 'destinatario' è sempre implicitamente ST0, il valore che c'era prima non viene sovrascritto, ma spostato su ST1... ...almeno questo in teoria quello che fa a me - a sto punto perché gli sono antipatico - è di ri-copiare ST0 su ST1 (corretto), ma in ST0 non viene messo il nuovo valore. La fadd poi funziona, ma ovviamente il valore è -2 e ci faccio le uova con -2 io volevo 18 miliardi e passa ![]()
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 30-06-2016 alle 08:42. |
![]() |
![]() |
![]() |
#29 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
Ma sbaglio o stai settando il valore di ecx a quella costante e poi usandolo come se fosse un indirizzo di memoria (isIndirect: true)?
Codice:
fild((QWORD *)0x5F800000) |
![]() |
![]() |
![]() |
#30 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
Purtroppo NASM è molto meno avanzato di MASM per esempio io non ho ancora capito come tradurre questa istruzione in NASM correttamente ed è lì che sbaglio di certo! fadd ds:uint64add io ho fatto così perché NASM non accetta un valore come operando (un bug?): fadd qword [0x5F800000] Qualche idea? Grazie! P.S. No, non è un baco di NASM, ma un'estensione di MASM: http://www.felixcloutier.com/x86/FADD:FADDP:FIADD.html http://www.ray.masmcode.com/tutorial/fpuchap8.htm#fadd come la emulo con NASM?
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 30-06-2016 alle 10:19. |
|
![]() |
![]() |
![]() |
#31 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
Perché un estensione? È questo:
Codice:
DC /0 FADD m64fp Valid Valid Add m64fp to ST(0) and store result in ST(0). Ultima modifica di ||ElChE||88 : 30-06-2016 alle 14:06. |
![]() |
![]() |
![]() |
#32 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Ma 'm64fp' non vuol dire 'm'[emory] quindi un puntatore?
Stasera posto il NASM generato a partire da X#...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#33 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
|
![]() |
![]() |
![]() |
#34 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Eccolo:
Codice:
; Conv_R_Un SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.0B: ;Asm mov dword EAX, [ESP + 4] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.0C: ;Asm fild qword [ESP] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.0D: ;Asm test dword EAX, EAX SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.0E: ;Asm JNS near SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.LabelSign_Bit_Unset SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.0F: ;Asm mov dword ECX, 0x5F800000 SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.10: ;Asm fild qword [ECX] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.11: ;Asm fadd st1 SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.LabelSign_Bit_Unset: SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.12: ;Asm fstp qword [ESP]
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#35 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
È sbagliato, sta usando 0x5F800000 come se fosse un puntatore.
Si, e infatti ds:uint64add è un puntatore ad una valore nel segmento dati. Ci sara un modo per definire un valore nel genere in NASM, no? Se non c'è (molto improbabile) usa lo stack e mov o push. Ultima modifica di ||ElChE||88 : 30-06-2016 alle 20:10. |
![]() |
![]() |
![]() |
#36 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
E' praticamente la prima versione l'istruzione fadd viene ignorata!
Codice:
SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.00: ;Asm mov dword EAX, [ESP + 4] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.01: ;Asm fild qword [ESP] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.02: ;Asm test dword EAX, EAX SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.03: ;Asm JNS near SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.LabelSign_Bit_Unset SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.04: ;Asm fadd dword [__ulong2double_const4] SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.LabelSign_Bit_Unset: SystemVoidCosmosCompilerTestsBclSystemDoubleTestExecute.IL_0208.05: ;Asm fstp qword [ESP] __ulong2double_const4 db 95, 128, 0, 0, 0, 0, 0, 0 avevo provato a definirla come intero quindi così, ma non cambiava nulla era come se ci fosse 0: __ulong2double_const4 db 0x5F800000
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 30-06-2016 alle 23:56. |
![]() |
![]() |
![]() |
#37 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
Sono entrambe sbagliate.
O usi Codice:
__ulong2double_const4 db 0, 0, 95, 128 Codice:
__ulong2double_const4 dd 5F800000h |
![]() |
![]() |
![]() |
#38 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Nulla da fare l'fadd è ignorata!
C'è qualche trusco da fare per forzare sta FPU a fare le addizioni? Noi la inizializziamo semplicemente con finit bisogna fare altro?
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#39 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, basta la finit.
Puoi provare a mettere una costante con byte completamente casuali (e cambiati a ogni generazione), e vedere cosa ottieni? A parte questo, sarebbe utile vedere il disassembly del binario generato. Quindi non quello di X#, ma proprio i byte generati e poi disassemblati con qualche tool.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 02-07-2016 alle 07:04. Motivo: Corretto refuso |
![]() |
![]() |
![]() |
#40 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Quote:
Cercare di obbligarla a fare computazioni con precisione a 64-bit richiederebbe extra lavoro per assicurarsi che gli arrotondamenti siano conformanti con gli stessi arrotondamenti un hardware che lavora nativamente a 64-bit farebbe.
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:50.