Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Google Pixel Watch 5 ha affinato una formula già convincente con hardware più veloce, Gemini offline e nuovi strumenti per sport e benessere. Abbiamo provato la versione LTE da 41 mm, comoda anche di notte e ben proporzionata sui polsi piccoli. Il design resta un punto di forza, ma l'autonomia premia ancora il 45 mm e alcune funzioni AI non sono disponibili in Italia: ecco che cosa cambia rispetto a Watch 4 e quale formato conviene scegliere oggi
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-09-2008, 23:17   #1
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
[asm e c++] Come far ritornare un parametro ? (naked function)

Salve a tutti, sto cercando di scrivere una classe che sfrutte le sse così da velocizzare il tutto, questa è la classe
Codice:
class Vector4
{
	public:
		__forceinline Vector4();
		__forceinline Vector4(const Vector4& v);
		__forceinline Vector4(const float* vec);

		// Operatori unari
		__forceinline Vector4 operator - ();

		// Operatori binari
		Vector4 __cdecl operator + (Vector4& vec);

		__m128 vector;
};
questo è il metodo che mi da problemi, somma semplicemente vec con this->vector.
Il metodo è dichiarato come naked per evitare il codice di prolog e epilog che mi rende lentissimo il codice ( con lento intendo che scivere il metodo senza sse è più veloce )
Codice:
__declspec(naked) Vector4 __cdecl Vector4::operator +(Vector4& vec)
{
	__asm
	{
		// questo per le funzioni naked
		mov eax, dword ptr[esp + 12]
		mov ecx, dword ptr[esp + 4]		//  esp+4 primo parametro

		// somma
		movaps xmm0, xmmword ptr[eax]
		movaps xmm1, xmmword ptr[ecx]
		addps xmm0, xmm1
	}
}
questo è il main per testare la classe
Codice:
int _tmain(int argc, _TCHAR* argv[])
{
	Vector4 v1, v2, v3;
	
	v1 = v2 + v3;
	
	return 0;
}
Quello che non riesco a fare è far si che v1 assuma il risultato di xmm0, ci sto sbattendo la testa da tre giorni e non riesco a venirne fuori, qualcuno potrebbe darmi un indizio su come procedere.

Grazie mille

Per i moderatori, mi sono dimenticato di aggiungere il titolo della discussione dopo [asm e c++], se potete modificarlo aggiungete "Come far ritornare un parametro?", grazie.

Ultima modifica di ercand : 15-09-2008 alle 23:24. Motivo: sono fesso.
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 01:27   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Naked function...ti vuoi proprio fare male

Allora...il problema è che devi ritornare una nuova istanza di Vector4, non devi modificare il vettore contenuto nell'istanza puntata da this.
In pratica devi fare in modo che il risultato della somma venga messo in un nuovo vettore allocato nello stack. Purtroppo non mi ricordo la convenzione per poter ritornare al chiamate una struttura dati complessa (per i dati semplici si ritorna in eax).

Imho se cerchi le prestazioni non ti conviene usare l'operatore + perché questo impone di ritornare prima una nuova istanza di classe che poi mettiamo venga assegnata ad una terza variabile tramite l'operatore uguale.

v = v1 + v2;

Impone l'allocazione di un vettore temporaneo che poi verrà assegnato a v: lo spreco di tempo è notevole, prima per l'accesso al vettore temporaneo e poi per la copia del vettore temporaneo in v.
Imho ti conviene fare così:


Vector4 & add(Vector4 &v);

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

Potrai anche mettere in sequenza diverse operazioni:

v = v1.add(v2).multiply(v3);

Se avessi bisogno di una copia puoi sempre definire un metodo clone:

Vector4 clone()
{
Vector4 cloned(this);
return cloned;
}

Per questo metodo non ti conviene usare le naked function. In questo modo risolvi automaticamente due problemi in un colpo solo
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 01:45   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ah...ovviamente servono anche il prologo e l'epilogo, in modo da mettere lo stack nella situazione iniziale per poter fare il ret A meno che tu non modifichi ebp, ma il ret serve sempre.

http://msdn.microsoft.com/en-us/libr...3a(VS.80).aspx
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 14:58   #4
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Innanzi tutto grazie per la risposta, e grazie per aver corretto il titolo della discussione .

Quote:
Originariamente inviato da cionci Guarda i messaggi
Imho ti conviene fare così:


Vector4 & add(Vector4 &v);

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

Potrai anche mettere in sequenza diverse operazioni:

v = v1.add(v2).multiply(v3);
Venedo a quello che mi hai consigliato mi sorge questo dubbio, se faccio questa operazione

v = v1.add(v2)

v assumerà il valore data dalla somma v1+v2, ma anche v1 non assumera lo stesso valore ( visto che il metodo add è chiamato su un'istanza di v1 )?

Grazie
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 15:16   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Certo, anche v1 assumerà lo stesso valore. L'equivalente dell'operazione precedente in effetti sarebbe:

v = v1;
v.add(v2);

O in alternativa:

v = v1.clone().add(v2);

Visto che solitamente si applicano varie operazioni ad uno stesso vettore però torna comodo per fare operazioni successive:

v1.add(v2).add(v3);

Un'operazione di questo tipo sarebbe equivalente a:

v1 = v1 + v2 + v3;

operazione che genera ben due variabili temporanee e tre operazioni di copia.

Ultima modifica di cionci : 16-09-2008 alle 15:20.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 21:09   #6
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Quindi mi consigli di mandare a quel paese le funzioni naked?
Visto che ci sono approfitto ulteriormente della tua disponibilità ; ho visto che ci sono le funzioni intrinsic a disposizione, io però non voglio utilizzare perchè vorrei capire da solo come sfruttare le sse, le funzioni intrinsic sono per caso dichiarate naked? lo chiedo perche vedendo il codice assembly dentro VS2008 non vedi la parte prolog/epilog ma probabilmente mi sbaglio.

Grazie
ercand è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
Starship: SpaceX potrebbe tentare di rec...
Federico Veronesi vince i Wildlife Photo...
Samsung Galaxy bloccati dopo l'aggiornam...
L'UE prolunga il periodo di test del pro...
Offerte Amazon di oggi: e-bike da 616€, ...
La missione cino-europea ESA Smile ha in...
Cisco sulle tracce dell’IA nei malware: ...
Nuovo Codice della strada: stop alla PEC...
Blue Origin Constellation Park: un nuovo...
E-bike da 615€ su Amazon: Bodywel F20PRO...
Windows 11 24H2, stop al supporto per Ho...
Gemini 4 Argon disponibile per tutti: co...
Sony avrebbe chiuso Overdrive, lo store ...
Abbiamo scattato con OPPO Find X10 Pro M...
Fino a 21 miliardi per i chip americani:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v