I think Rich said it all and I am quoting the Intel Spec (where Intel Term "IA-32e mode" = "AMD64 compatiblity mode"):
Chapter 6.2.1 "Code-Segment Descriptor in 64-bit Mode"
IA-32e mode uses a previously unused bit in the CS descriptor. Bit 53 is defined as the 64-bit (L) flag and is
used to select between 64-bit mode and compatibility mode when IA-32e mode is active (IA32_EFER.LMA = 1).
See Figure 6-2.
— If CS.L = 0 and IA-32e mode is active, the processor is running in compatibility mode. In this case, CS.D
selects the default size for data and addresses. If CS.D = 0, the default data and address size is 16 bits. If
CS.D = 1, the default data and address size is 32 bits.
— If CS.L = 1 and IA-32e mode is active, the only valid setting is CS.D = 0. This setting indicates a default
operand size of 32 bits and a default address size of 64 bits. The CS.L = 1 and CS.D = 1 bit combination is
reserved for future use and a #GP fault will be generated on an attempt to use a code segment with these
bits set in IA-32e mode.
That said, the Processor will only recognize the "CS.L" flag and treat it as such when it has already been placed into the "IA-32e mode".
Only then will "CS.L" make the difference (CS.L = 0 -> CS.D selects between 16-bit or 32-bit as the default data/address size, CS.L = 1 -> CS.D is ignored and even expected to be 0 and default data size of 32-bit and default address size is 64-bit)
As far as I understand, if you run the Processor in IA-32e mode you will have a code segment descriptor with "CS.L = 1" (in the global descriptor table). This descriptor is used for 64-bit protected mode programs by loading it into CS, it will never change, implicitely cover all of the address range and effectively disables segment protection (which is never used in IA-32e "native" mode).
In order to run 32-bit or 16-bit protected mode programs, you will add additional code segment descriptor with "CS.L = 0" (in the global descriptor table) which when CS is loaded with this segment selector will allow the distinction between 16-bit and 32-bit default data/address size with the Processor looking at the "CS.D" bit.
You should be able to verify this under "64-bit" Windows: if you run a 64-bit program under a debugger, it should have a different CS selector then if you run a 32-bit program under that debugger.