Is addrspacecast implemented on Windows?

Hi all!

On x86_64, segment prefix fs: is in address space 257 and gs: in address space 256. (BTW: are there constants for these magic values?) How can I use this in IR? I want to express this assembler code in IR:

                  mov RAX, 8;
                  mov RAX, GS:[RAX];

I tried the following:

define i64 @getStackBottom(i64 %addr) {
   %ptr = inttoptr i64 %addr to i64*
   %fs_ptr = addrspacecast i64* %ptr to i64 addrspace(256)*
   %bottom = load i64 addrspace(256)* %fs_ptr, align 1
   ret i64 %bottom

but this results in

LLVM ERROR: Cannot select: 0xcc6c60: i64 = addrspacecast 0xcc6b60[0 -> 256] [ORD=3] [ID=6]
   0xcc6b60: i64,ch = CopyFromReg 0xc95e38, 0xcc6a60 [ORD=1] [ID=5]
     0xcc6a60: i64 = Register %vreg0 [ID=1]
In function: getStackBottom
Stack dump:
0. Program arguments: llc thr_ll.ll
1. Running pass 'Function Pass Manager' on module 'thr_ll.ll'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function '@getStackBottom'

Do I miss something here? Or is this simply not yet implemented?


I believe the following does what you would like:

define i64 @getStackBottom(i64 %addr) {
%0 = inttoptr i64 %addr to i64 addrspace(256)*

%1 = load i64 addrspace(256)* %0, align 1
ret i64 %1

My build of llvm generates the following code with -O3:

movq %gs:(%rdi), %rax

Thanks! This works for me, too.