[LLVMdev] problem using 128-bit integer on x86-32

Duncan Sands baldrick at free.fr
Fri Jun 22 00:38:21 PDT 2012


Hi Jeff,

> I'm seeing LLVM (v 3.1) abort when trying to generate code that
> multiplies or divides 128-bit integers on x86-32.

this is a known issue.  The runtime library (libgcc) has routines for dividing
two 64-bit integers on x86-32, but not two 128-bit integers.  At least, that is
how it was last time I looked.  To overcome this libgcc or LLVM's compiler-rt
would need to get 128 bit division routines.

Ciao, Duncan.

> Here is a complete example function:
>
> define %jl_value_t* @foo564(%jl_value_t*, %jl_value_t**, i32) {
> top:
>    %3 = load %jl_value_t** %1, align 4, !dbg !5139
>    %4 = getelementptr inbounds %jl_value_t* %3, i32 0, i32 0, !dbg !5139
>    %5 = getelementptr %jl_value_t** %4, i32 1, !dbg !5139
>    %6 = bitcast %jl_value_t** %5 to i128*, !dbg !5139
>    %7 = load i128* %6, align 4, !dbg !5139
>    %8 = mul i128 %7, 137, !dbg !5146, !julia_type !5147
>    %9 = call %jl_value_t* @allocobj(i32 20), !dbg !5146
>    %10 = getelementptr inbounds %jl_value_t* %9, i32 0, i32 0, !dbg !5146
>    store %jl_value_t* inttoptr (i32 159792480 to %jl_value_t*),
> %jl_value_t** %10, align 4, !dbg !5146
>    %11 = getelementptr %jl_value_t** %10, i32 1, !dbg !5146
>    %12 = bitcast %jl_value_t** %11 to i128*, !dbg !5146
>    store i128 %8, i128* %12, align 4, !dbg !5146
>    ret %jl_value_t* %9, !dbg !5146
> }
>
> On JITing to native code, I get:
>
> UNREACHABLE executed!
> Stack dump:
> 0.	Running pass 'X86 DAG->DAG Instruction Selection' on function '@foo564'
> Aborted
>
> Add and subtract seem to work fine.
> Is there anything I might be doing wrong?
>
> thanks,
>
> -Jeff
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list