VMMaker.oscog-sk.2367
Author: sk
Time: 19 April 2018, 12:02:35.661622 pm
UUID: 0c2401e3-1450-4f73-8e81-958f50171595
Ancestors: VMMaker.oscog- nice.2366

** new primitive to compare strings (slang + JIT)
answers negative smi, 0 or positive smi (instead of 1, 2 or 3 in the
MiscPlugin)

* Slang (primitiveCompareWith)
order is optionnal.
comparison loop performed in rawCompare: string1 length: strLength1 with:
string2 length: strLength2 accessBlock: accessBlock

* JIT (genPrimitiveStringCompareWith)
the JIT primitive does not take order as parameter (assumed asciiOrder)
quick jump if one of the strings is empty

Le mer. 10 avr. 2019 à 11:56, ducasse <steph...@netcourrier.com> a écrit :

>
>
> On 10 Apr 2019, at 11:42, Cyril Ferlicot <cyril.ferli...@gmail.com> wrote:
>
> On Wed, Apr 10, 2019 at 10:42 AM Stéphane Ducasse
> <stephane.duca...@inria.fr> wrote:
>
>
> Hi
>
> I recall that clement told me that returning 1,2 or 3 instead of negative,
> zero, positive was slow.
> And I wonder if the primitive got change to the logic clement proposed?
>
> Could we not introduce another primitive and use it from the image?
>
>
> Hi,
>
> I think Sophie already did most of the work to introduce a new
> primitive. The missing steps to use the new optimized way to compare
> strings are:
> - Add the primitive to the primitive table VM side for Pharo/Squeak and
> Newspeak
>
>
> If you know that it is done from the VM side let us know.
>
> - Use the new primitive in the image and call this one for string
> comparison
>
> With this new primitive performances on string comparison can be
> improved around x2.5 to x5 times faster.
>
>
> compare: string1 with: string2 collated: order
> "Return 1, 2 or 3, if string1 is <, =, or > string2, with the collating
> order of characters given by the order array."
>
> | len1 len2 c1 c2 |
> <primitive: 'primitiveCompareString' module: 'MiscPrimitivePlugin'>
> <var: #string1 declareC: 'unsigned char *string1'>
> <var: #string2 declareC: 'unsigned char *string2'>
> <var: #order declareC: 'unsigned char *order'>
>
> len1 := string1 size.
> len2 := string2 size.
> 1 to: (len1 min: len2) do:
> [:i |
> c1 := order at: (string1 basicAt: i) + 1.
> c2 := order at: (string2 basicAt: i) + 1.
> c1 = c2 ifFalse:
> [c1 < c2 ifTrue: [^ 1] ifFalse: [^ 3]]].
> len1 = len2 ifTrue: [^ 2].
> len1 < len2 ifTrue: [^ 1] ifFalse: [^ 3].
>
> --------------------------------------------
> Stéphane Ducasse
> http://stephane.ducasse.free.fr
> http://www.synectique.eu / http://www.pharo.org
> 03 59 35 87 52
> Assistant: Julie Jonas
> FAX 03 59 57 78 50
> TEL 03 59 35 86 16
> S. Ducasse - Inria
> 40, avenue Halley,
> Parc Scientifique de la Haute Borne, Bât.A, Park Plaza
> Villeneuve d'Ascq 59650
> France
>
>
>
> --
> Cyril Ferlicot
> https://ferlicot.fr
>
>
>

Reply via email to