Here a code with some additional operations:
Code: Select all
Structure EightWord
w.w[8]
EndStructure
Procedure.s EightWordStr(*W8.EightWord)
Protected String.s = RSet(Hex(*W8\w[0], #PB_Word), 4, "0")
Protected I.i
For I = 1 To 7
String + " " + RSet(Hex(*W8\w[I], #PB_Word), 4, "0")
Next
ProcedureReturn String
EndProcedure
Define *A.EightWord = ?A
Define *B.EightWord = ?B
Define *C.EightWord = ?C
Debug "xmm0: "+EightWordStr(*A)
Debug "xmm1: "+EightWordStr(*B)
! MOV rax, [p_A]
! MOVDQU xmm0, [rax] ; xmm0 = *A
! MOV rax, [p_B]
! MOVDQU xmm1, [rax] ; xmm1 = *B
! MOVDQA xmm2, xmm0 ; xmm2 = *A
! PXOR xmm3, xmm3 ; xmm3 = {0 0 0 0 0 0 0 0}
! PCMPEQW xmm0, xmm1 ; xmm0 = (*A == *B)
! PMAXUW xmm2, xmm1 ; xmm2 = Max(*A, *B)
! PCMPEQW xmm2, xmm3 ; xmm2 = (xmm2 == 0)
! PXOR xmm0, xmm2 ; xmm0 = xmm0 ! xmm2
! MOV rax, [p_C]
! MOVDQU [rax], xmm0 ; *C = xmm0
Debug "result: "+EightWordStr(*C)
DataSection
A: : Data.w $0030, $0000, $0001, $0000, $0000, $0000, $0032, $0000
B: : Data.w $0030, $0000, $0000, $0000, $0000, $0000, $0032, $0000
C: : Data.w $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
EndDataSection