XMM double IN OUT

Bare metal programming in PureBasic, for experienced users
User avatar
oryaaaaa
Enthusiast
Enthusiast
Posts: 791
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

XMM double IN OUT

Post by oryaaaaa »

I want to following code by SSE2 XMM

Code: Select all

; a.d = b.d
  FLD    qword [esp+8]
  FSTP   qword [esp]
; b.d = a,d 
  FLD    qword [esp]
  FSTP   qword [esp+8]

Code: Select all

Procedure LPF201(*buffer_audio_ptr, *lpf_table_ptr, *out_buffer_ptr)
  ;/ http://forum.purebasic.com/english/viewtopic.php?f=35&t=47679
  ; Thanks "Wilbert in Netherlands"
  !MOV Ecx, [p.p_lpf_table_ptr]
  !MOV Edx, [p.p_buffer_audio_ptr]
  !SUB Edx, 800
  !PXOR xmm2, xmm2
  
  !MOV Eax, 201
  !align 4
  !InterLoop3:
  
  !movq xmm0, [Ecx] ; lpf
  !movlhps xmm0, xmm0
  !cvtps2pd xmm1, [Edx] ; L + R  float
  !mulpd xmm1, xmm0
  !ADDPD xmm2, xmm1
  !ADD Ecx, 8
  !ADD Edx, 8
  
  !DEC Eax
  !JNZ InterLoop3
  
  !cvtpd2ps xmm2, xmm2 ; double to float
  !MOV Edx, [p.p_out_buffer_ptr]
  !movq [Edx], xmm2 ; float, *out_buffer_prt
EndProcedure
I want to remove "!cvtpd2ps xmm2, xmm2", How manage xmm double data?

Code: Select all

Procedure LPF201(*buffer_audio_ptr, *lpf_table_ptr, *out_buffer_ptr)
  ;/ http://forum.purebasic.com/english/viewtopic.php?f=35&t=47679
  ; Thanks "Wilbert in Netherlands"
  !MOV Ecx, [p.p_lpf_table_ptr]
  !MOV Edx, [p.p_buffer_audio_ptr]
  !SUB Edx, 800
  !PXOR xmm2, xmm2
  
  !MOV Eax, 201
  !align 4
  !InterLoop3:
  
  !movq xmm0, [Ecx] ; lpf
  !movlhps xmm0, xmm0
  !cvtps2pd xmm1, [Edx] ; L + R  !! Double !!
  !mulpd xmm1, xmm0
  !ADDPD xmm2, xmm1
  !ADD Ecx, 8
  !ADD Edx, 8
  
  !DEC Eax
  !JNZ InterLoop3
  
  !cvtpd2ps xmm2, xmm2 ; !! Remove !! double to float
  !MOV Edx, [p.p_out_buffer_ptr]
  !movq [Edx], xmm2 ; !! double !!, *out_buffer_prt
EndProcedure
Thank you
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: XMM double IN OUT

Post by wilbert »

If you want to load two double precision samples instead of single precision, you can use
movupd xmm1, [Edx]
instead of
cvtps2pd xmm1, [Edx]
but in this case you will have to increase Edx by 16 instead of 8.
Windows (x64)
Raspberry Pi OS (Arm64)
Post Reply