compiler: Support bitcasting non-integers
Этот коммит содержится в:
родитель
bddb0c49b2
коммит
f7c2d0124d
1 изменённых файлов: 4 добавлений и 2 удалений
6
tgo.go
6
tgo.go
|
@ -1030,14 +1030,16 @@ func (c *Compiler) parseConvert(frame *Frame, typeTo types.Type, x ssa.Value) (l
|
||||||
}
|
}
|
||||||
sizeTo := c.targetData.TypeAllocSize(llvmTypeTo)
|
sizeTo := c.targetData.TypeAllocSize(llvmTypeTo)
|
||||||
|
|
||||||
|
if sizeFrom == sizeTo {
|
||||||
|
return c.builder.CreateBitCast(value, llvmTypeTo, ""), nil
|
||||||
|
}
|
||||||
|
|
||||||
if typeTo.Info() & types.IsInteger == 0 { // if not integer
|
if typeTo.Info() & types.IsInteger == 0 { // if not integer
|
||||||
return llvm.Value{}, errors.New("todo: convert: extend non-integer type")
|
return llvm.Value{}, errors.New("todo: convert: extend non-integer type")
|
||||||
}
|
}
|
||||||
|
|
||||||
if sizeFrom > sizeTo {
|
if sizeFrom > sizeTo {
|
||||||
return c.builder.CreateTrunc(value, llvmTypeTo, ""), nil
|
return c.builder.CreateTrunc(value, llvmTypeTo, ""), nil
|
||||||
} else if sizeFrom == sizeTo {
|
|
||||||
return c.builder.CreateBitCast(value, llvmTypeTo, ""), nil
|
|
||||||
} else if typeTo.Info() & types.IsUnsigned != 0 { // if unsigned
|
} else if typeTo.Info() & types.IsUnsigned != 0 { // if unsigned
|
||||||
return c.builder.CreateZExt(value, llvmTypeTo, ""), nil
|
return c.builder.CreateZExt(value, llvmTypeTo, ""), nil
|
||||||
} else { // if signed
|
} else { // if signed
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче