strcmp in Linux
(gdb) disassemble
Dump of assembler code for function __strcmp_avx2:
=> 0x00007ffff7f30ae0 <+0>: endbr64
0x00007ffff7f30ae4 <+4>: mov %edi,%eax
0x00007ffff7f30ae6 <+6>: xor %edx,%edx
0x00007ffff7f30ae8 <+8>: vpxor %ymm7,%ymm7,%ymm7
0x00007ffff7f30aec <+12>: or %esi,%eax
0x00007ffff7f30aee <+14>: and $0xfff,%eax
0x00007ffff7f30af3 <+19>: cmp $0xf80,%eax
0x00007ffff7f30af8 <+24>: jg 0x7ffff7f30e50 <__strcmp_avx2+880>
0x00007ffff7f30afe <+30>: vmovdqu (%rdi),%ymm1
0x00007ffff7f30b02 <+34>: vpcmpeqb (%rsi),%ymm1,%ymm0
0x00007ffff7f30b06 <+38>: vpminub %ymm1,%ymm0,%ymm0
0x00007ffff7f30b0a <+42>: vpcmpeqb %ymm7,%ymm0,%ymm0
0x00007ffff7f30b0e <+46>: vpmovmskb %ymm0,%ecx
0x00007ffff7f30b12 <+50>: test %ecx,%ecx
0x00007ffff7f30b14 <+52>: je 0x7ffff7f30b90 <__strcmp_avx2+176>
0x00007ffff7f30b16 <+54>: tzcnt %ecx,%edx
0x00007ffff7f30b1a <+58>: movzbl (%rdi,%rdx,1),%eax
0x00007ffff7f30b1e <+62>: movzbl (%rsi,%rdx,1),%edx
0x00007ffff7f30b22 <+66>: sub %edx,%eax
0x00007ffff7f30b24 <+68>: vzeroupper
0x00007ffff7f30b27 <+71>: retq
0x00007ffff7f30b28 <+72>: nopl 0x0(%rax,%rax,1)
0x00007ffff7f30b30 <+80>: tzcnt %ecx,%edx
0x00007ffff7f30b34 <+84>: movzbl 0x20(%rdi,%rdx,1),%eax
0x00007ffff7f30b39 <+89>: movzbl 0x20(%rsi,%rdx,1),%edx
0x00007ffff7f30b3e <+94>: sub %edx,%eax
0x00007ffff7f30b40 <+96>: vzeroupper
0x00007ffff7f30b43 <+99>: retq
0x00007ffff7f30b44 <+100>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30b4f <+111>: nop
0x00007ffff7f30b50 <+112>: tzcnt %ecx,%edx
0x00007ffff7f30b54 <+116>: movzbl 0x40(%rdi,%rdx,1),%eax
0x00007ffff7f30b59 <+121>: movzbl 0x40(%rsi,%rdx,1),%edx
0x00007ffff7f30b5e <+126>: sub %edx,%eax
0x00007ffff7f30b60 <+128>: vzeroupper
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30b63 <+131>: retq
0x00007ffff7f30b64 <+132>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30b6f <+143>: nop
0x00007ffff7f30b70 <+144>: tzcnt %ecx,%edx
0x00007ffff7f30b74 <+148>: movzbl 0x60(%rdi,%rdx,1),%eax
0x00007ffff7f30b79 <+153>: movzbl 0x60(%rsi,%rdx,1),%edx
0x00007ffff7f30b7e <+158>: sub %edx,%eax
0x00007ffff7f30b80 <+160>: vzeroupper
0x00007ffff7f30b83 <+163>: retq
0x00007ffff7f30b84 <+164>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30b8f <+175>: nop
0x00007ffff7f30b90 <+176>: vmovdqu 0x20(%rdi),%ymm6
0x00007ffff7f30b95 <+181>: vpcmpeqb 0x20(%rsi),%ymm6,%ymm3
0x00007ffff7f30b9a <+186>: vpminub %ymm6,%ymm3,%ymm3
0x00007ffff7f30b9e <+190>: vpcmpeqb %ymm7,%ymm3,%ymm3
0x00007ffff7f30ba2 <+194>: vpmovmskb %ymm3,%ecx
0x00007ffff7f30ba6 <+198>: test %ecx,%ecx
0x00007ffff7f30ba8 <+200>: jne 0x7ffff7f30b30 <__strcmp_avx2+80>
0x00007ffff7f30baa <+202>: vmovdqu 0x40(%rdi),%ymm5
0x00007ffff7f30baf <+207>: vmovdqu 0x60(%rdi),%ymm4
0x00007ffff7f30bb4 <+212>: vmovdqu 0x60(%rsi),%ymm0
0x00007ffff7f30bb9 <+217>: vpcmpeqb 0x40(%rsi),%ymm5,%ymm2
0x00007ffff7f30bbe <+222>: vpminub %ymm5,%ymm2,%ymm2
0x00007ffff7f30bc2 <+226>: vpcmpeqb %ymm4,%ymm0,%ymm0
0x00007ffff7f30bc6 <+230>: vpcmpeqb %ymm7,%ymm2,%ymm2
0x00007ffff7f30bca <+234>: vpmovmskb %ymm2,%ecx
0x00007ffff7f30bce <+238>: test %ecx,%ecx
0x00007ffff7f30bd0 <+240>: jne 0x7ffff7f30b50 <__strcmp_avx2+112>
0x00007ffff7f30bd6 <+246>: vpminub %ymm4,%ymm0,%ymm0
0x00007ffff7f30bda <+250>: vpcmpeqb %ymm7,%ymm0,%ymm0
0x00007ffff7f30bde <+254>: vpmovmskb %ymm0,%ecx
0x00007ffff7f30be2 <+258>: test %ecx,%ecx
0x00007ffff7f30be4 <+260>: jne 0x7ffff7f30b70 <__strcmp_avx2+144>
0x00007ffff7f30be6 <+262>: lea 0x80(%rdi),%rdx
0x00007ffff7f30bed <+269>: mov $0x1000,%ecx
0x00007ffff7f30bf2 <+274>: and $0xffffffffffffff80,%rdx
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30bf6 <+278>: sub %rdi,%rdx
0x00007ffff7f30bf9 <+281>: lea (%rdi,%rdx,1),%rax
0x00007ffff7f30bfd <+285>: add %rsi,%rdx
0x00007ffff7f30c00 <+288>: mov %rdx,%rsi
0x00007ffff7f30c03 <+291>: and $0xfff,%esi
0x00007ffff7f30c09 <+297>: sub %rsi,%rcx
0x00007ffff7f30c0c <+300>: shr $0x7,%rcx
0x00007ffff7f30c10 <+304>: mov %ecx,%esi
0x00007ffff7f30c12 <+306>: jmp 0x7ffff7f30c2d <__strcmp_avx2+333>
0x00007ffff7f30c14 <+308>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30c1f <+319>: nop
0x00007ffff7f30c20 <+320>: add $0x80,%rax
0x00007ffff7f30c26 <+326>: add $0x80,%rdx
0x00007ffff7f30c2d <+333>: test %esi,%esi
0x00007ffff7f30c2f <+335>: lea -0x1(%esi),%esi
0x00007ffff7f30c33 <+339>: je 0x7ffff7f30d10 <__strcmp_avx2+560>
0x00007ffff7f30c39 <+345>: vmovdqa (%rax),%ymm0
0x00007ffff7f30c3d <+349>: vmovdqa 0x20(%rax),%ymm3
0x00007ffff7f30c42 <+354>: vpcmpeqb (%rdx),%ymm0,%ymm4
0x00007ffff7f30c46 <+358>: vpcmpeqb 0x20(%rdx),%ymm3,%ymm1
0x00007ffff7f30c4b <+363>: vpminub %ymm0,%ymm4,%ymm4
0x00007ffff7f30c4f <+367>: vpminub %ymm3,%ymm1,%ymm1
0x00007ffff7f30c53 <+371>: vmovdqa 0x40(%rax),%ymm2
0x00007ffff7f30c58 <+376>: vpminub %ymm1,%ymm4,%ymm0
0x00007ffff7f30c5c <+380>: vmovdqa 0x60(%rax),%ymm3
0x00007ffff7f30c61 <+385>: vpcmpeqb 0x40(%rdx),%ymm2,%ymm5
0x00007ffff7f30c66 <+390>: vpcmpeqb 0x60(%rdx),%ymm3,%ymm6
0x00007ffff7f30c6b <+395>: vpminub %ymm2,%ymm5,%ymm5
0x00007ffff7f30c6f <+399>: vpminub %ymm3,%ymm6,%ymm6
0x00007ffff7f30c73 <+403>: vpminub %ymm5,%ymm0,%ymm0
0x00007ffff7f30c77 <+407>: vpminub %ymm6,%ymm0,%ymm0
0x00007ffff7f30c7b <+411>: vpcmpeqb %ymm7,%ymm0,%ymm0
0x00007ffff7f30c7f <+415>: vpmovmskb %ymm0,%ecx
0x00007ffff7f30c83 <+419>: test %ecx,%ecx
0x00007ffff7f30c85 <+421>: je 0x7ffff7f30c20 <__strcmp_avx2+320>
0x00007ffff7f30c87 <+423>: vpcmpeqb %ymm7,%ymm4,%ymm0
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30c8b <+427>: vpmovmskb %ymm0,%edi
0x00007ffff7f30c8f <+431>: test %edi,%edi
0x00007ffff7f30c91 <+433>: je 0x7ffff7f30cb0 <__strcmp_avx2+464>
0x00007ffff7f30c93 <+435>: tzcnt %edi,%ecx
0x00007ffff7f30c97 <+439>: movzbl (%rax,%rcx,1),%eax
0x00007ffff7f30c9b <+443>: movzbl (%rdx,%rcx,1),%edx
0x00007ffff7f30c9f <+447>: sub %edx,%eax
0x00007ffff7f30ca1 <+449>: vzeroupper
0x00007ffff7f30ca4 <+452>: retq
0x00007ffff7f30ca5 <+453>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30cb0 <+464>: vpcmpeqb %ymm7,%ymm1,%ymm1
0x00007ffff7f30cb4 <+468>: vpmovmskb %ymm1,%ecx
0x00007ffff7f30cb8 <+472>: test %ecx,%ecx
0x00007ffff7f30cba <+474>: je 0x7ffff7f30cd0 <__strcmp_avx2+496>
0x00007ffff7f30cbc <+476>: tzcnt %ecx,%edi
0x00007ffff7f30cc0 <+480>: movzbl 0x20(%rax,%rdi,1),%eax
0x00007ffff7f30cc5 <+485>: movzbl 0x20(%rdx,%rdi,1),%edx
0x00007ffff7f30cca <+490>: sub %edx,%eax
0x00007ffff7f30ccc <+492>: vzeroupper
0x00007ffff7f30ccf <+495>: retq
0x00007ffff7f30cd0 <+496>: vpcmpeqb %ymm7,%ymm5,%ymm5
0x00007ffff7f30cd4 <+500>: vpmovmskb %ymm5,%ecx
0x00007ffff7f30cd8 <+504>: test %ecx,%ecx
0x00007ffff7f30cda <+506>: je 0x7ffff7f30cf0 <__strcmp_avx2+528>
0x00007ffff7f30cdc <+508>: tzcnt %ecx,%edi
0x00007ffff7f30ce0 <+512>: movzbl 0x40(%rax,%rdi,1),%eax
0x00007ffff7f30ce5 <+517>: movzbl 0x40(%rdx,%rdi,1),%edx
0x00007ffff7f30cea <+522>: sub %edx,%eax
0x00007ffff7f30cec <+524>: vzeroupper
0x00007ffff7f30cef <+527>: retq
0x00007ffff7f30cf0 <+528>: vpcmpeqb %ymm7,%ymm6,%ymm6
0x00007ffff7f30cf4 <+532>: vpmovmskb %ymm6,%esi
0x00007ffff7f30cf8 <+536>: tzcnt %esi,%ecx
0x00007ffff7f30cfc <+540>: movzbl 0x60(%rax,%rcx,1),%eax
0x00007ffff7f30d01 <+545>: movzbl 0x60(%rdx,%rcx,1),%edx
0x00007ffff7f30d06 <+550>: sub %edx,%eax
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30d08 <+552>: vzeroupper
0x00007ffff7f30d0b <+555>: retq
0x00007ffff7f30d0c <+556>: nopl 0x0(%rax)
0x00007ffff7f30d10 <+560>: xor %r10d,%r10d
0x00007ffff7f30d13 <+563>: mov %rdx,%rcx
0x00007ffff7f30d16 <+566>: and $0x7f,%ecx
0x00007ffff7f30d19 <+569>: sub %rcx,%r10
0x00007ffff7f30d1c <+572>: cmp $0x40,%ecx
0x00007ffff7f30d1f <+575>: jge 0x7ffff7f30d80 <__strcmp_avx2+672>
0x00007ffff7f30d21 <+577>: vmovdqu (%rax,%r10,1),%ymm2
0x00007ffff7f30d27 <+583>: vmovdqu 0x20(%rax,%r10,1),%ymm3
0x00007ffff7f30d2e <+590>: vpcmpeqb (%rdx,%r10,1),%ymm2,%ymm0
0x00007ffff7f30d34 <+596>: vpcmpeqb 0x20(%rdx,%r10,1),%ymm3,%ymm1
0x00007ffff7f30d3b <+603>: vpminub %ymm2,%ymm0,%ymm0
0x00007ffff7f30d3f <+607>: vpminub %ymm3,%ymm1,%ymm1
0x00007ffff7f30d43 <+611>: vpcmpeqb %ymm7,%ymm0,%ymm0
0x00007ffff7f30d47 <+615>: vpcmpeqb %ymm7,%ymm1,%ymm1
0x00007ffff7f30d4b <+619>: vpmovmskb %ymm0,%edi
0x00007ffff7f30d4f <+623>: vpmovmskb %ymm1,%esi
0x00007ffff7f30d53 <+627>: shl $0x20,%rsi
0x00007ffff7f30d57 <+631>: xor %rsi,%rdi
0x00007ffff7f30d5a <+634>: shr %cl,%rdi
0x00007ffff7f30d5d <+637>: test %rdi,%rdi
0x00007ffff7f30d60 <+640>: je 0x7ffff7f30d80 <__strcmp_avx2+672>
0x00007ffff7f30d62 <+642>: tzcnt %rdi,%rcx
0x00007ffff7f30d67 <+647>: movzbl (%rax,%rcx,1),%eax
0x00007ffff7f30d6b <+651>: movzbl (%rdx,%rcx,1),%edx
0x00007ffff7f30d6f <+655>: sub %edx,%eax
0x00007ffff7f30d71 <+657>: vzeroupper
0x00007ffff7f30d74 <+660>: retq
0x00007ffff7f30d75 <+661>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30d80 <+672>: vmovdqu 0x40(%rax,%r10,1),%ymm2
0x00007ffff7f30d87 <+679>: vmovdqu 0x60(%rax,%r10,1),%ymm3
0x00007ffff7f30d8e <+686>: vpcmpeqb 0x40(%rdx,%r10,1),%ymm2,%ymm5
0x00007ffff7f30d95 <+693>: vpminub %ymm2,%ymm5,%ymm5
0x00007ffff7f30d99 <+697>: vpcmpeqb 0x60(%rdx,%r10,1),%ymm3,%ymm6
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30da0 <+704>: vpcmpeqb %ymm7,%ymm5,%ymm5
0x00007ffff7f30da4 <+708>: vpminub %ymm3,%ymm6,%ymm6
0x00007ffff7f30da8 <+712>: vpcmpeqb %ymm7,%ymm6,%ymm6
0x00007ffff7f30dac <+716>: vpmovmskb %ymm5,%edi
0x00007ffff7f30db0 <+720>: vpmovmskb %ymm6,%esi
0x00007ffff7f30db4 <+724>: shl $0x20,%rsi
0x00007ffff7f30db8 <+728>: xor %rsi,%rdi
0x00007ffff7f30dbb <+731>: xor %r8d,%r8d
0x00007ffff7f30dbe <+734>: sub $0x40,%ecx
0x00007ffff7f30dc1 <+737>: jle 0x7ffff7f30dc9 <__strcmp_avx2+745>
0x00007ffff7f30dc3 <+739>: shr %cl,%rdi
0x00007ffff7f30dc6 <+742>: mov %ecx,%r8d
0x00007ffff7f30dc9 <+745>: mov $0x1f,%esi
0x00007ffff7f30dce <+750>: test %rdi,%rdi
0x00007ffff7f30dd1 <+753>: je 0x7ffff7f30c39 <__strcmp_avx2+345>
0x00007ffff7f30dd7 <+759>: tzcnt %rdi,%rcx
0x00007ffff7f30ddc <+764>: add %r10,%rcx
0x00007ffff7f30ddf <+767>: add %r8,%rcx
0x00007ffff7f30de2 <+770>: movzbl 0x40(%rax,%rcx,1),%eax
0x00007ffff7f30de7 <+775>: movzbl 0x40(%rdx,%rcx,1),%edx
0x00007ffff7f30dec <+780>: sub %edx,%eax
0x00007ffff7f30dee <+782>: vzeroupper
0x00007ffff7f30df1 <+785>: retq
0x00007ffff7f30df2 <+786>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30dfd <+797>: nopl (%rax)
0x00007ffff7f30e00 <+800>: sub %ecx,%eax
0x00007ffff7f30e02 <+802>: jne 0x7ffff7f30e21 <__strcmp_avx2+833>
0x00007ffff7f30e04 <+804>: add $0x1,%edx
0x00007ffff7f30e07 <+807>: cmp $0x80,%edx
0x00007ffff7f30e0d <+813>: je 0x7ffff7f30be6 <__strcmp_avx2+262>
0x00007ffff7f30e13 <+819>: movzbl (%rdi,%rdx,1),%eax
0x00007ffff7f30e17 <+823>: movzbl (%rsi,%rdx,1),%ecx
0x00007ffff7f30e1b <+827>: test %eax,%eax
0x00007ffff7f30e1d <+829>: jne 0x7ffff7f30e00 <__strcmp_avx2+800>
0x00007ffff7f30e1f <+831>: sub %ecx,%eax
0x00007ffff7f30e21 <+833>: vzeroupper
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30e24 <+836>: retq
0x00007ffff7f30e25 <+837>: data16 nopw %cs:0x0(%rax,%rax,1)
0x00007ffff7f30e30 <+848>: add %rdx,%rdi
0x00007ffff7f30e33 <+851>: add %rdx,%rsi
0x00007ffff7f30e36 <+854>: tzcnt %ecx,%edx
0x00007ffff7f30e3a <+858>: movzbl (%rdi,%rdx,1),%eax
0x00007ffff7f30e3e <+862>: movzbl (%rsi,%rdx,1),%edx
0x00007ffff7f30e42 <+866>: sub %edx,%eax
0x00007ffff7f30e44 <+868>: vzeroupper
0x00007ffff7f30e47 <+871>: retq
0x00007ffff7f30e48 <+872>: nopl 0x0(%rax,%rax,1)
0x00007ffff7f30e50 <+880>: cmp $0xfe0,%eax
0x00007ffff7f30e55 <+885>: jg 0x7ffff7f30e7e <__strcmp_avx2+926>
0x00007ffff7f30e57 <+887>: vmovdqu (%rdi,%rdx,1),%ymm1
0x00007ffff7f30e5c <+892>: vpcmpeqb (%rsi,%rdx,1),%ymm1,%ymm0
0x00007ffff7f30e61 <+897>: vpminub %ymm1,%ymm0,%ymm0
0x00007ffff7f30e65 <+901>: vpcmpeqb %ymm7,%ymm0,%ymm0
0x00007ffff7f30e69 <+905>: vpmovmskb %ymm0,%ecx
0x00007ffff7f30e6d <+909>: test %ecx,%ecx
0x00007ffff7f30e6f <+911>: jne 0x7ffff7f30e30 <__strcmp_avx2+848>
0x00007ffff7f30e71 <+913>: add $0x20,%edx
0x00007ffff7f30e74 <+916>: add $0x20,%eax
0x00007ffff7f30e77 <+919>: cmp $0xfe0,%eax
0x00007ffff7f30e7c <+924>: jle 0x7ffff7f30e57 <__strcmp_avx2+887>
0x00007ffff7f30e7e <+926>: cmp $0xff0,%eax
0x00007ffff7f30e83 <+931>: jg 0x7ffff7f30ea5 <__strcmp_avx2+965>
0x00007ffff7f30e85 <+933>: vmovdqu (%rdi,%rdx,1),%xmm1
0x00007ffff7f30e8a <+938>: vpcmpeqb (%rsi,%rdx,1),%xmm1,%xmm0
0x00007ffff7f30e8f <+943>: vpminub %xmm1,%xmm0,%xmm0
0x00007ffff7f30e93 <+947>: vpcmpeqb %xmm7,%xmm0,%xmm0
0x00007ffff7f30e97 <+951>: vpmovmskb %xmm0,%ecx
0x00007ffff7f30e9b <+955>: test %ecx,%ecx
0x00007ffff7f30e9d <+957>: jne 0x7ffff7f30e30 <__strcmp_avx2+848>
0x00007ffff7f30e9f <+959>: add $0x10,%edx
0x00007ffff7f30ea2 <+962>: add $0x10,%eax
0x00007ffff7f30ea5 <+965>: cmp $0xff8,%eax
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7f30eaa <+970>: jg 0x7ffff7f30eda <__strcmp_avx2+1018>
0x00007ffff7f30eac <+972>: vmovq (%rdi,%rdx,1),%xmm1
0x00007ffff7f30eb1 <+977>: vmovq (%rsi,%rdx,1),%xmm0
0x00007ffff7f30eb6 <+982>: vpcmpeqb %xmm0,%xmm1,%xmm0
0x00007ffff7f30eba <+986>: vpminub %xmm1,%xmm0,%xmm0
0x00007ffff7f30ebe <+990>: vpcmpeqb %xmm7,%xmm0,%xmm0
0x00007ffff7f30ec2 <+994>: vpmovmskb %xmm0,%ecx
0x00007ffff7f30ec6 <+998>: and $0xff,%ecx
0x00007ffff7f30ecc <+1004>: test %ecx,%ecx
0x00007ffff7f30ece <+1006>: jne 0x7ffff7f30e30 <__strcmp_avx2+848>
0x00007ffff7f30ed4 <+1012>: add $0x8,%edx
0x00007ffff7f30ed7 <+1015>: add $0x8,%eax
0x00007ffff7f30eda <+1018>: cmp $0xffc,%eax
0x00007ffff7f30edf <+1023>: jg 0x7ffff7f30f09 <__strcmp_avx2+1065>
0x00007ffff7f30ee1 <+1025>: vmovd (%rdi,%rdx,1),%xmm1
0x00007ffff7f30ee6 <+1030>: vmovd (%rsi,%rdx,1),%xmm0
0x00007ffff7f30eeb <+1035>: vpcmpeqb %xmm0,%xmm1,%xmm0
0x00007ffff7f30eef <+1039>: vpminub %xmm1,%xmm0,%xmm0
0x00007ffff7f30ef3 <+1043>: vpcmpeqb %xmm7,%xmm0,%xmm0
0x00007ffff7f30ef7 <+1047>: vpmovmskb %xmm0,%ecx
0x00007ffff7f30efb <+1051>: and $0xf,%ecx
0x00007ffff7f30efe <+1054>: test %ecx,%ecx
0x00007ffff7f30f00 <+1056>: jne 0x7ffff7f30e30 <__strcmp_avx2+848>
0x00007ffff7f30f06 <+1062>: add $0x4,%edx
0x00007ffff7f30f09 <+1065>: movzbl (%rdi,%rdx,1),%eax
0x00007ffff7f30f0d <+1069>: movzbl (%rsi,%rdx,1),%ecx
0x00007ffff7f30f11 <+1073>: test %eax,%eax
0x00007ffff7f30f13 <+1075>: jne 0x7ffff7f30e00 <__strcmp_avx2+800>
0x00007ffff7f30f19 <+1081>: sub %ecx,%eax
0x00007ffff7f30f1b <+1083>: vzeroupper
0x00007ffff7f30f1e <+1086>: retq
End of assembler dump.
这个机制是GNU上的IFUNC。 其实用更特殊一些的指令处理字符串是有好处的,更隐蔽,也更不容易误判。
这个是debian9 sparc64 libc里的strcmp,不知道Ghidra逆的对不对,要开始看Sparc v9的指令了。
**************************************************************
* FUNCTION *
**************************************************************
int __stdcall strcmp(char * __s1, char * __s2)
int o0:4 <RETURN>
char * o0:8 __s1
char * o1:8 __s2
strcmp XREF[127]: Entry Point(*),
FUN_00124074:0012429c(c),
FUN_00124074:001242b8(c),
FUN_00124074:001242e0(c),
FUN_00124074:001242fc(c),
FUN_00124074:0012436c(c),
FUN_00124074:001243e8(c),
FUN_00124b90:00124dfc(c),
FUN_00124b90:00124e18(c),
FUN_00124b90:00124e34(c),
FUN_00124b90:00124e50(c),
FUN_00124f38:00124f68(c),
FUN_00124f38:00124fa4(c),
FUN_00124f38:00124fcc(c),
FUN_00124f38:00124fe4(c),
FUN_00125060:001250a8(c),
FUN_00125ea4:00125edc(c),
FUN_0012c170:0012c1f4(c),
ttyslot:001e6608(c), 00255d84,
[more]
00187240 82 12 40 08 or __s2,__s1,g1
00187244 17 20 20 20 sethi %hi(0x80808000),o3
00187248 80 88 60 07 andcc g1,0x7,g0
0018724c 12 40 00 34 bpne,pn %icc,LAB_0018731c
00187250 96 12 e0 80 _or o3,0x80,o3
00187254 da 5a 00 00 ldx [__s1+g0],o5
00187258 92 22 40 08 sub __s2,__s1,__s2
LAB_0018725c XREF[1]: fchdir:001dd058(R)
0018725c 83 2a f0 20 sllx o3,0x20,g1
00187260 c6 5a 00 09 ldx [__s1+__s2],g3
00187264 96 12 c0 01 or o3,g1,o3
00187268 10 68 00 06 bpa,pt LAB_00187280
0018726c 95 32 f0 07 _srlx o3,0x7,o2
00187270 30 ?? 30h 0
00187271 68 ?? 68h h
00187272 00 ?? 00h
00187273 04 ?? 04h
00187274 01 ?? 01h
00187275 00 ?? 00h
00187276 00 ?? 00h
00187277 00 ?? 00h
00187278 01 ?? 01h
00187279 00 ?? 00h
0018727a 00 ?? 00h
0018727b 00 ?? 00h
0018727c 01 ?? 01h
0018727d 00 ?? 00h
0018727e 00 ?? 00h
0018727f 00 ?? 00h
LAB_00187280 XREF[3]: 00187268(j), 0018729c(j),
00187354(j)
00187280 90 02 20 08 add __s1,0x8,__s1
00187284 84 23 40 0a sub o5,o2,g2
00187288 98 9b 40 03 xorcc o5,g3,o4
0018728c 12 60 00 08 bpne,pn %xcc,LAB_001872ac
00187290 82 2a c0 0d _andn o3,o5,g1
00187294 da da 10 40 ldxa [__s1+g0] 0x82,o5
00187298 80 88 40 02 andcc g1,g2,g0
0018729c 22 6f ff f9 bpe,a,pt %xcc,LAB_00187280
LAB_001872a0 XREF[1]: chdir:001dd014(R)
001872a0 c6 da 10 49 _ldxa [__s1+__s2] 0x82,g3
001872a4 81 c3 e0 08 retl
001872a8 90 10 20 00 _mov 0x0,__s1
LAB_001872ac XREF[2]: 0018728c(j), 001873c0(j)
001872ac 84 2b 40 0b andn o5,o3,g2
001872b0 92 12 e0 01 or o3,0x1,__s2
001872b4 90 10 20 01 mov 0x1,__s1
001872b8 84 20 80 09 sub g2,__s2,g2
001872bc 80 a3 40 03 cmp o5,g3
001872c0 82 28 40 02 andn g1,g2,g1
001872c4 91 65 37 ff movleu %xcc,-0x1,__s1
001872c8 83 30 70 07 srlx g1,0x7,g1
001872cc 84 10 20 00 mov 0x0,g2
001872d0 80 88 61 00 andcc g1,0x100,g0
001872d4 85 66 70 08 movne %xcc,0x8,g2
001872d8 93 28 70 2f sllx g1,0x2f,__s2
001872dc 85 7a 6c 10 movrlz __s2,0x10,g2
001872e0 93 28 70 27 sllx g1,0x27,__s2
001872e4 85 7a 6c 18 movrlz __s2,0x18,g2
001872e8 93 28 70 1f sllx g1,0x1f,__s2
001872ec 85 7a 6c 20 movrlz __s2,0x20,g2
001872f0 93 28 70 17 sllx g1,0x17,__s2
001872f4 85 7a 6c 28 movrlz __s2,0x28,g2
001872f8 93 28 70 0f sllx g1,0xf,__s2
001872fc 85 7a 6c 30 movrlz __s2,0x30,g2
00187300 93 28 70 07 sllx g1,0x7,__s2
00187304 85 7a 6c 38 movrlz __s2,0x38,g2
00187308 83 30 50 02 srlx g1,g2,g1
0018730c 83 28 50 02 sllx g1,g2,g1
00187310 80 a0 40 0c cmp g1,o4
00187314 81 c3 e0 08 retl
00187318 91 67 30 00 _movgu %xcc,0x0,__s1
LAB_0018731c XREF[1]: 0018724c(j)
0018731c 92 22 40 08 sub __s2,__s1,__s2
00187320 83 2a f0 20 sllx o3,0x20,g1
00187324 96 12 c0 01 or o3,g1,o3
00187328 84 0a 20 07 and __s1,0x7,g2
0018732c 95 32 f0 07 srlx o3,0x7,o2
00187330 90 2a 20 07 andn __s1,0x7,__s1
00187334 da da 10 40 ldxa [__s1+g0] 0x82,o5
00187338 88 8a 60 07 andcc __s2,0x7,g4
0018733c 99 28 a0 03 sll g2,0x3,o4
00187340 12 40 00 07 bpne,pn %icc,LAB_0018735c
00187344 82 10 3f ff _mov -0x1,g1
00187348 cc da 10 49 ldxa [__s1+__s2] 0x82,g6
0018734c 85 30 50 0c srlx g1,o4,g2
00187350 9a 33 40 02 orn o5,g2,o5
00187354 10 6f ff cb bpa,pt LAB_00187280
00187358 86 31 80 02 _orn g6,g2,g3
LAB_0018735c XREF[1]: 00187340(j)
0018735c 89 29 30 03 sllx g4,0x3,g4
00187360 92 2a 60 07 andn __s2,0x7,__s2
00187364 cc da 10 49 ldxa [__s1+__s2] 0x82,g6
00187368 84 10 20 40 mov 0x40,g2
0018736c 8a 20 80 04 sub g2,g4,g5
00187370 83 30 50 0c srlx g1,o4,g1
LAB_00187374 XREF[2]: creat:001dcfbc(R),
creat:001dcfdc(R)
00187374 92 02 60 08 add __s2,0x8,__s2
00187378 9a 33 40 01 orn o5,g1,o5
0018737c 87 29 90 04 sllx g6,g4,g3
00187380 cc da 10 49 ldxa [__s1+__s2] 0x82,g6
00187384 90 02 20 08 add __s1,0x8,__s1
00187388 84 23 40 0a sub o5,o2,g2
0018738c 99 31 90 05 srlx g6,g5,o4
00187390 86 10 c0 0c or g3,o4,g3
00187394 86 30 c0 01 orn g3,g1,g3
00187398 10 68 00 09 bpa,pt LAB_001873bc
0018739c 82 2a c0 0d _andn o3,o5,g1
LAB_001873a0 XREF[1]: 001873c8(j)
001873a0 87 29 90 04 sllx g6,g4,g3
001873a4 cc da 10 49 ldxa [__s1+__s2] 0x82,g6
001873a8 90 02 20 08 add __s1,0x8,__s1
LAB_001873ac XREF[1]: pipe2:001dcf08(R)
001873ac 84 23 40 0a sub o5,o2,g2
001873b0 99 31 90 05 srlx g6,g5,o4
001873b4 82 2a c0 0d andn o3,o5,g1
001873b8 86 10 c0 0c or g3,o4,g3
LAB_001873bc XREF[1]: 00187398(j)
001873bc 98 9b 40 03 xorcc o5,g3,o4
001873c0 12 67 ff bb bpne,pn %xcc,LAB_001872ac
001873c4 80 88 40 02 _andcc g1,g2,g0
001873c8 22 6f ff f6 bpe,a,pt %xcc,LAB_001873a0
001873cc da da 10 40 _ldxa [__s1+g0] 0x82,o5
001873d0 81 c3 e0 08 retl
001873d4 90 10 20 00 _mov 0x0,__s1
001873d8 01 ?? 01h
001873d9 00 ?? 00h
001873da 00 ?? 00h
001873db 00 ?? 00h
001873dc 01 ?? 01h
001873dd 00 ?? 00h
001873de 00 ?? 00h
001873df 00 ?? 00h
sparc64 ubuntu7.10 libc-2.6.1.so
**************************************************************
* FUNCTION *
**************************************************************
int __stdcall strcmp(char * __s1, char * __s2)
int o0:4 <RETURN>
char * o0:8 __s1
char * o1:8 __s2
strcmp XREF[144]: Entry Point(*),
FUN_0012d0c0:0012d2f0(c),
FUN_0012d0c0:0012d358(c),
FUN_0012d0c0:0012d370(c),
FUN_0012d0c0:0012d3c4(c),
FUN_0012d0c0:0012d69c(c),
FUN_0012da00:0012dc54(c),
FUN_0012da00:0012dc6c(c),
FUN_0012da00:0012dc84(c),
FUN_0012da00:0012dc9c(c),
FUN_0012dea0:0012ded0(c),
FUN_0012dea0:0012df10(c),
FUN_0012dea0:0012df28(c),
FUN_0012e380:0012e3c4(c),
FUN_0012edc0:0012ede0(c),
FUN_0012edc0:0012edf4(c),
FUN_0012edc0:0012ee08(c),
FUN_0012edc0:0012ee1c(c),
FUN_0012edc0:0012ee30(c),
00256134, [more]
0018d2e0 03 00 40 40 sethi %hi(0x1010000),g1
0018d2e4 80 8a 20 07 andcc __s1,0x7,g0
0018d2e8 12 40 00 66 bpne,pn %icc,LAB_0018d480
0018d2ec 82 10 61 01 _or g1,0x101,g1
0018d2f0 86 8a 60 07 andcc __s2,0x7,g3
0018d2f4 12 40 00 74 bpne,pn %icc,LAB_0018d4c4
0018d2f8 85 28 70 20 _sllx g1,0x20,g2
0018d2fc d4 5a 00 00 ldx [__s1+g0],o2
0018d300 82 10 40 02 or g1,g2,g1
LAB_0018d304 XREF[1]: 0018d4bc(j)
0018d304 d6 5a 40 00 ldx [__s2+g0],o3
0018d308 92 22 40 08 sub __s2,__s1,__s2
0018d30c 85 28 70 07 sllx g1,0x7,g2
LAB_0018d310 XREF[2]: 0018d328(j), 0018d398(j)
0018d310 90 02 20 08 add __s1,0x8,__s1
0018d314 86 22 80 01 sub o2,g1,g3
0018d318 80 a2 80 0b cmp o2,o3
0018d31c 12 60 00 29 bpne,pn %xcc,LAB_0018d3c0
0018d320 d4 da 10 40 _ldxa [__s1+g0] 0x82,o2
0018d324 80 88 c0 02 andcc g3,g2,g0
0018d328 22 6f ff fa bpe,a,pt %xcc,LAB_0018d310
0018d32c d6 da 50 48 _ldxa [__s2+__s1] 0x82,o3
0018d330 98 80 c0 01 addcc g3,g1,o4
0018d334 87 30 f0 20 srlx g3,0x20,g3
0018d338 80 88 c0 02 andcc g3,g2,g0
0018d33c 02 68 00 0d bpe,pt %xcc,LAB_0018d370
0018d340 9b 33 30 38 _srlx o4,0x38,o5
0018d344 80 8b 60 ff andcc o5,0xff,g0
0018d348 02 40 00 16 bpe,pn %icc,LAB_0018d3a0
0018d34c 9b 33 30 30 _srlx o4,0x30,o5
0018d350 80 8b 60 ff andcc o5,0xff,g0
0018d354 02 40 00 13 bpe,pn %icc,LAB_0018d3a0
0018d358 9b 33 30 28 _srlx o4,0x28,o5
0018d35c 80 8b 60 ff andcc o5,0xff,g0
0018d360 02 40 00 10 bpe,pn %icc,LAB_0018d3a0
0018d364 9b 33 30 20 _srlx o4,0x20,o5
0018d368 80 8b 60 ff andcc o5,0xff,g0
0018d36c 02 40 00 0d bpe,pn %icc,LAB_0018d3a0
LAB_0018d370 XREF[1]: 0018d33c(j)
0018d370 9b 33 30 18 _srlx o4,0x18,o5
0018d374 80 8b 60 ff andcc o5,0xff,g0
0018d378 02 40 00 0a bpe,pn %icc,LAB_0018d3a0
0018d37c 9b 33 30 10 _srlx o4,0x10,o5
0018d380 80 8b 60 ff andcc o5,0xff,g0
0018d384 02 40 00 07 bpe,pn %icc,LAB_0018d3a0
0018d388 9b 33 30 08 _srlx o4,0x8,o5
0018d38c 80 8b 60 ff andcc o5,0xff,g0
0018d390 02 40 00 04 bpe,pn %icc,LAB_0018d3a0
0018d394 80 8b 20 ff _andcc o4,0xff,g0
0018d398 32 47 ff de bpne,a,pn %icc,LAB_0018d310
0018d39c d6 da 50 48 _ldxa [__s2+__s1] 0x82,o3
LAB_0018d3a0 XREF[16]: 0018d348(j), 0018d354(j),
0018d360(j), 0018d36c(j),
0018d378(j), 0018d384(j),
0018d390(j), 0018d4a0(j),
0018d528(j), 0018d534(j),
0018d540(j), 0018d54c(j),
0018d558(j), 0018d564(j),
0018d570(j), 0018d578(j)
0018d3a0 81 c3 e0 08 retl
0018d3a4 90 10 00 00 _mov g0,__s1
0018d3a8 30 68 00 06 bpa,a,pt LAB_0018d3c0
0018d3ac 01 00 00 00 nop
0018d3b0 01 00 00 00 nop
0018d3b4 01 00 00 00 nop
0018d3b8 01 00 00 00 nop
0018d3bc 01 00 00 00 nop
LAB_0018d3c0 XREF[3]: 0018d31c(j), 0018d3a8(j),
0018d504(j)
0018d3c0 8c 10 20 ff mov 0xff,g6
0018d3c4 80 88 c0 02 andcc g3,g2,g0
0018d3c8 02 68 00 1b bpe,pt %xcc,LAB_0018d434
0018d3cc 98 80 c0 01 _addcc g3,g1,o4
0018d3d0 87 30 f0 20 srlx g3,0x20,g3
0018d3d4 80 88 c0 02 andcc g3,g2,g0
0018d3d8 02 68 00 0d bpe,pt %xcc,LAB_0018d40c
0018d3dc 9b 29 b0 38 _sllx g6,0x38,o5
0018d3e0 80 8b 00 0d andcc o4,o5,g0
0018d3e4 02 60 00 1b bpe,pn %xcc,LAB_0018d450
0018d3e8 9b 29 b0 30 _sllx g6,0x30,o5
0018d3ec 80 8b 00 0d andcc o4,o5,g0
0018d3f0 02 60 00 18 bpe,pn %xcc,LAB_0018d450
0018d3f4 9b 29 b0 28 _sllx g6,0x28,o5
0018d3f8 80 8b 00 0d andcc o4,o5,g0
0018d3fc 02 60 00 15 bpe,pn %xcc,LAB_0018d450
0018d400 9b 29 b0 20 _sllx g6,0x20,o5
0018d404 80 8b 00 0d andcc o4,o5,g0
0018d408 02 60 00 12 bpe,pn %xcc,LAB_0018d450
LAB_0018d40c XREF[1]: 0018d3d8(j)
0018d40c 9b 29 b0 18 _sllx g6,0x18,o5
0018d410 80 8b 00 0d andcc o4,o5,g0
0018d414 02 40 00 0f bpe,pn %icc,LAB_0018d450
0018d418 9b 29 b0 10 _sllx g6,0x10,o5
0018d41c 80 8b 00 0d andcc o4,o5,g0
0018d420 02 40 00 0c bpe,pn %icc,LAB_0018d450
0018d424 9b 29 b0 08 _sllx g6,0x8,o5
0018d428 80 8b 00 0d andcc o4,o5,g0
0018d42c 02 40 00 09 bpe,pn %icc,LAB_0018d450
0018d430 9a 10 00 06 _mov g6,o5
LAB_0018d434 XREF[1]: 0018d3c8(j)
0018d434 80 a3 00 0b cmp o4,o3
0018d438 90 10 3f ff mov -0x1,__s1
0018d43c 81 c3 e0 08 retl
0018d440 91 67 30 01 _movgu %xcc,0x1,__s1
0018d444 30 68 00 03 bpa,a,pt LAB_0018d450
0018d448 01 00 00 00 nop
0018d44c 01 00 00 00 nop
LAB_0018d450 XREF[8]: 0018d3e4(j), 0018d3f0(j),
0018d3fc(j), 0018d408(j),
0018d414(j), 0018d420(j),
0018d42c(j), 0018d444(j)
0018d450 8c 23 60 01 sub o5,0x1,g6
0018d454 90 10 00 00 mov g0,__s1
0018d458 9a 13 40 06 or o5,g6,o5
0018d45c 98 2b 00 0d andn o4,o5,o4
0018d460 96 2a c0 0d andn o3,o5,o3
0018d464 80 a3 00 0b cmp o4,o3
0018d468 91 67 30 01 movgu %xcc,0x1,__s1
0018d46c 81 c3 e0 08 retl
0018d470 91 65 77 ff _movcs %xcc,-0x1,__s1
LAB_0018d474 XREF[1]: 0018d498(j)
0018d474 81 c3 e0 08 retl
0018d478 90 10 00 0c _mov o4,__s1
0018d47c 01 00 00 00 nop
LAB_0018d480 XREF[1]: 0018d2e8(j)
0018d480 d4 0a 00 00 ldub [__s1+g0],o2
0018d484 90 02 20 01 add __s1,0x1,__s1
0018d488 d6 0a 40 00 ldub [__s2+g0],o3
0018d48c 85 28 70 20 sllx g1,0x20,g2
LAB_0018d490 XREF[1]: 0018d4ac(j)
0018d490 92 02 60 01 add __s2,0x1,__s2
0018d494 98 a2 80 0b subcc o2,o3,o4
0018d498 12 67 ff f7 bpne,pn %xcc,LAB_0018d474
0018d49c d4 8a 10 40 _lduba [__s1+g0] 0x82,o2
0018d4a0 02 f2 ff c0 brz,pn o3,LAB_0018d3a0
0018d4a4 d6 8a 50 40 _lduba [__s2+g0] 0x82,o3
0018d4a8 80 8a 20 07 andcc __s1,0x7,g0
0018d4ac 32 47 ff f9 bpne,a,pn %icc,LAB_0018d490
0018d4b0 90 02 20 01 _add __s1,0x1,__s1
0018d4b4 82 10 40 02 or g1,g2,g1
0018d4b8 86 8a 60 07 andcc __s2,0x7,g3
0018d4bc 22 47 ff 92 bpe,a,pn %icc,LAB_0018d304
0018d4c0 d4 da 10 40 _ldxa [__s1+g0] 0x82,o2
LAB_0018d4c4 XREF[1]: 0018d2f4(j)
0018d4c4 8b 28 f0 03 sllx g3,0x3,g5
0018d4c8 9a 10 20 40 mov 0x40,o5
0018d4cc 92 22 40 03 sub __s2,g3,__s2
0018d4d0 9a 23 40 05 sub o5,g5,o5
0018d4d4 cc da 50 40 ldxa [__s2+g0] 0x82,g6
0018d4d8 82 10 40 02 or g1,g2,g1
0018d4dc 92 22 40 08 sub __s2,__s1,__s2
0018d4e0 85 28 70 07 sllx g1,0x7,g2
0018d4e4 92 02 60 08 add __s2,0x8,__s2
LAB_0018d4e8 XREF[1]: 0018d510(j)
0018d4e8 97 29 90 05 sllx g6,g5,o3
0018d4ec cc da 50 48 ldxa [__s2+__s1] 0x82,g6
LAB_0018d4f0 XREF[1]: 0018d580(j)
0018d4f0 99 31 90 0d srlx g6,o5,o4
0018d4f4 d4 da 10 40 ldxa [__s1+g0] 0x82,o2
0018d4f8 96 12 c0 0c or o3,o4,o3
0018d4fc 90 02 20 08 add __s1,0x8,__s1
0018d500 80 a2 80 0b cmp o2,o3
0018d504 12 67 ff af bpne,pn %xcc,LAB_0018d3c0
0018d508 86 22 80 01 _sub o2,g1,g3
0018d50c 80 88 c0 02 andcc g3,g2,g0
0018d510 02 6f ff f6 bpe,pt %xcc,LAB_0018d4e8
0018d514 87 30 f0 20 _srlx g3,0x20,g3
0018d518 80 88 c0 02 andcc g3,g2,g0
0018d51c 02 68 00 0d bpe,pt %xcc,LAB_0018d550
0018d520 87 32 b0 38 _srlx o2,0x38,g3
0018d524 80 88 e0 ff andcc g3,0xff,g0
0018d528 02 47 ff 9e bpe,pn %icc,LAB_0018d3a0
0018d52c 87 32 b0 30 _srlx o2,0x30,g3
0018d530 80 88 e0 ff andcc g3,0xff,g0
0018d534 02 47 ff 9b bpe,pn %icc,LAB_0018d3a0
0018d538 87 32 b0 28 _srlx o2,0x28,g3
0018d53c 80 88 e0 ff andcc g3,0xff,g0
0018d540 02 47 ff 98 bpe,pn %icc,LAB_0018d3a0
0018d544 87 32 b0 20 _srlx o2,0x20,g3
0018d548 80 88 e0 ff andcc g3,0xff,g0
0018d54c 02 47 ff 95 bpe,pn %icc,LAB_0018d3a0
LAB_0018d550 XREF[1]: 0018d51c(j)
0018d550 87 32 b0 18 _srlx o2,0x18,g3
0018d554 80 88 e0 ff andcc g3,0xff,g0
0018d558 02 47 ff 92 bpe,pn %icc,LAB_0018d3a0
0018d55c 87 32 b0 10 _srlx o2,0x10,g3
0018d560 80 88 e0 ff andcc g3,0xff,g0
0018d564 02 47 ff 8f bpe,pn %icc,LAB_0018d3a0
0018d568 87 32 b0 08 _srlx o2,0x8,g3
0018d56c 80 88 e0 ff andcc g3,0xff,g0
0018d570 02 47 ff 8c bpe,pn %icc,LAB_0018d3a0
0018d574 80 8a a0 ff _andcc o2,0xff,g0
0018d578 02 47 ff 8a bpe,pn %icc,LAB_0018d3a0
0018d57c 97 29 90 05 _sllx g6,g5,o3
0018d580 10 6f ff dc bpa,pt LAB_0018d4f0
0018d584 cc da 50 48 _ldxa [__s2+__s1] 0x82,g6
0018d588 30 68 00 06 bpa,a,pt FUN_0018d5a0 undefined FUN_0018d5a0()
-- Flow Override: CALL_RETURN (CALL_TERMINATOR)
0018d58c 01 00 00 00 nop
0018d590 01 00 00 00 nop
0018d594 01 00 00 00 nop
0018d598 01 00 00 00 nop
0018d59c 01 00 00 00 nop