@@ -122,40 +122,10 @@ public static Vector128<Byte> Parse(ReadOnlySpan<Char> chars) {
122122 throw new ArgumentException ( $ "The length of the string is not { chars } ", nameof ( chars ) ) ;
123123 }
124124
125- //Upper 4 bits goes first in the string and lower 4 bits goes second in the string
126- //We create two vectors, one for the upper 4 bits and one for the lower 4 bits
127- //
128- //No need to init, all values will be overwritten
129- Unsafe . SkipInit ( out Vector128 < Byte > upper ) ;
130- Unsafe . SkipInit ( out Vector128 < Byte > lower ) ;
131-
132- static Vector128 < Byte > LowerNine ( Vector128 < Byte > data ) {
133- //Each element becomes 0xff if it is greater than 9
134- var elementsGreatherThan = Vector128 . GreaterThan ( data , _9Vector ) ;
135- var toAdd = Vector128 . BitwiseAnd ( elementsGreatherThan , _9AOffsetVector ) ;
136- return Vector128 . Subtract ( data , toAdd ) ;
137- }
138-
139- Int32 J = 0 ;
140- for ( Int32 I = 0 ; I < UUID_STRING_LENGTH ; ) {
141- if ( I is 8 or 13 or 18 or 23 ) {
142- I ++ ;
143- continue ;
144- }
145- upper = Vector128 . WithElement ( upper , J , ( Byte ) chars [ I ++ ] ) ;
146- lower = Vector128 . WithElement ( lower , J , ( Byte ) chars [ I ++ ] ) ;
147- J ++ ;
148- }
149-
150- upper = LowerNine ( upper ) ;
151- upper = Vector128 . Subtract ( upper , _AddOffset ) ;
125+ Span < Byte > data = stackalloc Byte [ UUID_STRING_LENGTH ] ;
126+ for ( Int32 i = 0 ; i < UUID_STRING_LENGTH ; i ++ ) data [ i ] = ( Byte ) chars [ i ] ;
152127
153- lower = LowerNine ( lower ) ;
154- lower = Vector128 . Subtract ( lower , _AddOffset ) ;
155-
156- upper = Vector128 . ShiftLeft ( upper , 4 ) ;
157-
158- return Vector128 . BitwiseOr ( upper , lower ) ;
128+ return Parse ( data ) ;
159129 }
160130
161131 /// <inheritdoc cref="Parse(ReadOnlySpan{Char})"/>
@@ -164,37 +134,44 @@ internal static Vector128<Byte> Parse(ReadOnlySpan<Byte> chars) {
164134 throw new ArgumentException ( $ "The length of the string is not { chars . Length } ", nameof ( chars ) ) ;
165135 }
166136
167- //Upper 4 bits goes first in the string and lower 4 bits goes second in the string
168- //We create two vectors, one for the upper 4 bits and one for the lower 4 bits
169- //
170- //No need to init, all values will be overwritten
137+
171138 Unsafe . SkipInit ( out Vector128 < Byte > upper ) ;
172139 Unsafe . SkipInit ( out Vector128 < Byte > lower ) ;
173140
174141 static Vector128 < Byte > LowerNine ( Vector128 < Byte > data ) {
175- //Each element becomes 0xff if it is greater than 9
176- var elementsGreatherThan = Vector128 . GreaterThan ( data , _9Vector ) ;
177- var toAdd = Vector128 . BitwiseAnd ( elementsGreatherThan , _9AOffsetVector ) ;
178- return Vector128 . Subtract ( data , toAdd ) ;
142+ // Bring 'a' - 'z' down to 'A' - 'Z'
143+ // Bring 'A' - 'Z' down to values above '9'
144+ // Bring '0' - '9' to values of 0 to 9
145+
146+ // If we have values still large then 9 we must have A-Z and a-z
147+ // Bring a-z to A-Z
148+ var elementsGreatherThan = Vector128 . GreaterThan ( data , Vector128 . Create < Byte > ( ( Byte ) 'Z' ) ) ;
149+ var toSubstract = Vector128 . BitwiseAnd ( elementsGreatherThan , Vector128 . Create < Byte > ( 'a' - 'A' ) ) ;
150+ data = Vector128 . Subtract < Byte > ( data , toSubstract ) ;
151+
152+ elementsGreatherThan = Vector128 . GreaterThan ( data , Vector128 . Create < Byte > ( ( Byte ) '9' ) ) ;
153+ toSubstract = Vector128 . BitwiseAnd ( elementsGreatherThan , Vector128 . Create < Byte > ( 'A' - ( '9' + 1 ) ) ) ;
154+ data = Vector128 . Subtract < Byte > ( data , toSubstract ) ;
155+
156+ data = Vector128 . Subtract < Byte > ( data , Vector128 . Create ( ( Byte ) '0' ) ) ;
157+
158+ return data ;
179159 }
180160
181- Int32 J = 0 ;
182- for ( Int32 I = 0 ; I < UUID_STRING_LENGTH ; ) {
183- if ( I is 8 or 13 or 18 or 23 ) {
184- I ++ ;
161+ Int32 j = 0 ;
162+ for ( Int32 i = 0 ; i < UUID_STRING_LENGTH ; ) {
163+ if ( i is 8 or 13 or 18 or 23 ) {
164+ i ++ ;
185165 continue ;
186166 }
187- upper = Vector128 . WithElement ( upper , J , chars [ I ++ ] ) ;
188- lower = Vector128 . WithElement ( lower , J , chars [ I ++ ] ) ;
189- J ++ ;
167+ upper = Vector128 . WithElement ( upper , j , chars [ i ] ) ;
168+ lower = Vector128 . WithElement ( lower , j , chars [ i + 1 ] ) ;
169+ i += 2 ;
170+ j ++ ;
190171 }
191172
192173 upper = LowerNine ( upper ) ;
193- upper = Vector128 . Subtract ( upper , _AddOffset ) ;
194-
195174 lower = LowerNine ( lower ) ;
196- lower = Vector128 . Subtract ( lower , _AddOffset ) ;
197-
198175 upper = Vector128 . ShiftLeft ( upper , 4 ) ;
199176
200177 return Vector128 . BitwiseOr ( upper , lower ) ;
0 commit comments