[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