Problem solved, but not for all motherboards.
I was trying two 6x86L-166's, one Cyrix, one IBM, on GA-5SMM motherboard. The Cyrix one failed to boot, so I thought it was dead and almost torched it. Fortunately I tried it on P5A and it runs like a happy pup. I later learned that 5SMM does not officially support 6x86/6x86L at all.
I wrote a tiny piece of assembly code to test if 6x86's CPUID function is enabled, and it turned out negative on both 5SMM and P5A. 5SMM does have a "6x86/MII CPUID enable" option in its BIOS but it makes no difference on 6x86L. It's easy to write a code to enable 6x86's CPUID functionality but I don't know how to make it execute before XP's boot.
My solution is not perfect: hard mod motherboard BIOS to turn on 6x86's CPUID by default. To enable CPUID, the bit 7 of 6x86's CCR4 register (0xE8 by index) must be set to 1. Using modbin 4.50.82a I found that register in 5SMM BIOS and changed that bit to 1 and finally got XP running. This solution only works for BIOS with existing entry to CCR4 register since I don't know how to create a new register entry with modbin, so it doesn't work on some boards such as P5A and P5S-VM.
In XP the CPU is recognized as 6x86MX 1.39GHz 😲 It runs much slower than it should be, and there are artifacts on the screen under VGA mode. I doubt the glitches are due to incompatibility between 5SMM and IBM 6x86L.