RE: faster strcpy()

Mikael Klasson (mikael.klasson@sciron.se)
Fri, 24 Apr 1998 18:05:45 +0200


This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------ =_NextPart_000_01BD6FAB.9B86DEC0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

> > > while(*a++=*b++); perhaps?
> >
> > No, that's how it was before. This copies byte at time and is slow.
> > memcpy is fast. If we could use the same technique as memcpy uses
> > to copy strings and at the same time check the terminating 0...
> > I don't see the answer myself, does anybody see?
>
> I don't know c or i386 assembler, but there are string commands. Would
one of
> them do it? I don't have my assembler book handy. Is there a store and
> continue while zero?

No. There's "rep movsX" (where X is b/w/d) for moving data but that one
requires ecx to be initialized to the number of items to copy and
doesn't care much about what it's copying. A "lodsd" and "stosd"
followed by the test routine someone posted here earlier and a
conditional jump seems like the best solution to me (provided that the
gain of copying dwords make up for the time the test routine takes to
execute compared to a "lodsb","stosb","or al,al", "jnz lop" version).

[some time later]
Copying dwords certainly seem to make up for the overhead time of the
test routine. Even when implementing it with a .com file under dos (16
bit seg and _lots_ of penalties when operating on 32 bit data) it's a
few cycles faster per byte copied than the latter version (copying byte
by byte). In a proper implementation, with 32 bit segment, the
difference should be quite a bit bigger.

I don't guarantee that my implementation is bug-free (nothing is). Feel
free to check it out if you like, I've attached it to this mail. No,
it's not optimized.

--
Mikael

------ =_NextPart_000_01BD6FAB.9B86DEC0 Content-Type: application/octet-stream; name="TEST2.COM" Content-Transfer-Encoding: base64

DzFmo2QBuRAnvmgBv4UBZq1mq2aL2GYtAQEBAWb302Yjw2YlgICAgHTl4t0PMWYrBmQB6AEAw2ZQ ZsHoEOgCAGZYZlCKxOgCAGZYZlDA6AToAgBmWGZQJA8EkCcUQCfNKWZYwwAAAABUZXN0aW5nIG1l bSBjb3B5IHJvdXRpbmVzLi4uAA==

------ =_NextPart_000_01BD6FAB.9B86DEC0 Content-Type: application/octet-stream; name="TEST2.ASM" Content-Transfer-Encoding: base64

Lm1vZGVsIHRpbnkNCi4zODYNCi5jb2RlDQpvcmcgMTAwaA0KX21haW46DQoNCiAgICAgICAgZGIg ICAgICAwZmgsMzFoDQogICAgICAgIG1vdiAgICAgdGltZTEsZWF4DQoNCiAgICAgICAgbW92ICAg ICBjeCwxMDAwMA0KbWFpbmxvcDoNCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBsZWEgICAgIHNp LHMxDQogICAgICAgIGxlYSAgICAgZGksczINCg0KbG9wOg0KICAgICAgICBsb2RzZA0KICAgICAg ICBzdG9zZA0KDQogICAgICAgIG1vdiAgICAgZWJ4LGVheA0KICAgICAgICBzdWIgICAgIGVheCww MTAxMDEwMWgNCiAgICAgICAgbm90ICAgICBlYngNCiAgICAgICAgYW5kICAgICBlYXgsZWJ4DQog ICAgICAgIGFuZCAgICAgZWF4LDgwODA4MDgwaA0KDQogICAgICAgIGp6ICAgICAgbG9wDQoNCjst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tDQo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCg0KICAgICAgICBsb29wICAgIG1haW5sb3ANCg0KICAgICAgICBkYiAgICAg IDBmaCwzMWgNCg0KICAgICAgICBzdWIgICAgIGVheCx0aW1lMQ0KICAgICAgICBjYWxsICAgIF9w dXRkDQoNCiAgICAgICAgcmV0DQoNCl9wdXRkOg0KICAgICAgICBwdXNoICAgIGVheA0KICAgICAg ICBzaHIgICAgIGVheCwxNg0KICAgICAgICBjYWxsICAgIF9wdXR3DQogICAgICAgIHBvcCAgICAg ZWF4DQpfcHV0dzoNCiAgICAgICAgcHVzaCAgICBlYXgNCiAgICAgICAgbW92ICAgICBhbCxhaA0K ICAgICAgICBjYWxsICAgIF9wdXRiDQogICAgICAgIHBvcCAgICAgZWF4DQpfcHV0YjoNCiAgICAg ICAgcHVzaCAgICBlYXgNCiAgICAgICAgc2hyICAgICBhbCw0DQogICAgICAgIGNhbGwgICAgX3B1 dG4NCiAgICAgICAgcG9wICAgICBlYXgNCl9wdXRuOg0KICAgICAgICBwdXNoICAgIGVheA0KICAg ICAgICBhbmQgICAgIGFsLDBmaA0KICAgICAgICBhZGQgICAgIGFsLDkwaA0KICAgICAgICBkYWEN CiAgICAgICAgYWRjICAgICBhbCw0MGgNCiAgICAgICAgZGFhDQogICAgICAgIGludCAgICAgMjlo DQogICAgICAgIHBvcCAgICAgZWF4DQogICAgICAgIHJldA0KDQp0aW1lMSAgIGRkICAgICAgPw0K DQpzMSAgICAgIGRiICAgICAgJ1Rlc3RpbmcgbWVtIGNvcHkgcm91dGluZXMuLi4nLDAgICAgICAg IDsgMjggY2hhcnMNCnMyICAgICAgZGIgICAgICAyNTYgZHVwKD8pDQoNCmVuZCBfbWFpbg0KGg==

------ =_NextPart_000_01BD6FAB.9B86DEC0 Content-Type: application/octet-stream; name="TEST.COM" Content-Transfer-Encoding: base64

DzFmo08BuRAnvlMBv3ABrKoKwHX64vIPMWYrBk8B6AEAw2ZQZsHoEOgCAGZYZlCKxOgCAGZYZlDA 6AToAgBmWGZQJA8EkCcUQCfNKWZYwwAAAABUZXN0aW5nIG1lbSBjb3B5IHJvdXRpbmVzLi4uAA==

------ =_NextPart_000_01BD6FAB.9B86DEC0 Content-Type: application/octet-stream; name="TEST.ASM" Content-Transfer-Encoding: base64

Lm1vZGVsIHRpbnkNCi4zODYNCi5jb2RlDQpvcmcgMTAwaA0KX21haW46DQoNCiAgICAgICAgZGIg ICAgICAwZmgsMzFoDQogICAgICAgIG1vdiAgICAgdGltZTEsZWF4DQoNCiAgICAgICAgbW92ICAg ICBjeCwxMDAwMA0KbWFpbmxvcDoNCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBsZWEgICAgIHNp LHMxDQogICAgICAgIGxlYSAgICAgZGksczINCg0KbG9wOg0KICAgICAgICBsb2RzYg0KICAgICAg ICBzdG9zYg0KICAgICAgICBvciAgICAgIGFsLGFsDQogICAgICAgIGpueiAgICAgbG9wDQoNCjst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tDQo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCg0KICAgICAgICBsb29wICAgIG1haW5sb3ANCg0KICAgICAgICBkYiAgICAg IDBmaCwzMWgNCg0KICAgICAgICBzdWIgICAgIGVheCx0aW1lMQ0KICAgICAgICBjYWxsICAgIF9w dXRkDQoNCiAgICAgICAgcmV0DQoNCl9wdXRkOg0KICAgICAgICBwdXNoICAgIGVheA0KICAgICAg ICBzaHIgICAgIGVheCwxNg0KICAgICAgICBjYWxsICAgIF9wdXR3DQogICAgICAgIHBvcCAgICAg ZWF4DQpfcHV0dzoNCiAgICAgICAgcHVzaCAgICBlYXgNCiAgICAgICAgbW92ICAgICBhbCxhaA0K ICAgICAgICBjYWxsICAgIF9wdXRiDQogICAgICAgIHBvcCAgICAgZWF4DQpfcHV0YjoNCiAgICAg ICAgcHVzaCAgICBlYXgNCiAgICAgICAgc2hyICAgICBhbCw0DQogICAgICAgIGNhbGwgICAgX3B1 dG4NCiAgICAgICAgcG9wICAgICBlYXgNCl9wdXRuOg0KICAgICAgICBwdXNoICAgIGVheA0KICAg ICAgICBhbmQgICAgIGFsLDBmaA0KICAgICAgICBhZGQgICAgIGFsLDkwaA0KICAgICAgICBkYWEN CiAgICAgICAgYWRjICAgICBhbCw0MGgNCiAgICAgICAgZGFhDQogICAgICAgIGludCAgICAgMjlo DQogICAgICAgIHBvcCAgICAgZWF4DQogICAgICAgIHJldA0KDQp0aW1lMSAgIGRkICAgICAgPw0K DQpzMSAgICAgIGRiICAgICAgJ1Rlc3RpbmcgbWVtIGNvcHkgcm91dGluZXMuLi4nLDAgICAgICAg IDsgMjggY2hhcnMNCnMyICAgICAgZGIgICAgICAyNTYgZHVwKD8pDQoNCmVuZCBfbWFpbg0KGg==

------ =_NextPart_000_01BD6FAB.9B86DEC0--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu