
This commit changes a target triple like "armv6m-none-eabi" to "armv6m-unknown-unknow-eabi". The reason is that while the former is correctly parsed in Clang (due to normalization), it wasn't parsed correctly in LLVM meaning that the environment wasn't set to EABI. This change normalizes all target triples and uses the EABI environment (-eabi in the triple) for Cortex-M targets. This change also drops the `--target=` flag in the target JSON files, the flag is now added implicitly in `(*compileopts.Config).CFlags()`. This removes some duplication in target JSON files. Unfortunately, this change also increases code size for Cortex-M targets. It looks like LLVM now emits calls like __aeabi_memmove instead of memmove, which pull in slightly more code (they basically just call the regular C functions) and the calls themself don't seem to be as efficient as they could be. Perhaps this is a LLVM bug that will be fixed in the future, as this is a very common occurrence.
82 строки
2,6 КиБ
LLVM
82 строки
2,6 КиБ
LLVM
; ModuleID = 'float.go'
|
|
source_filename = "float.go"
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-wasi"
|
|
|
|
declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*)
|
|
|
|
define hidden void @main.init(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
define hidden i32 @main.f32tou32(float %v, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%positive = fcmp oge float %v, 0.000000e+00
|
|
%withinmax = fcmp ole float %v, 0x41EFFFFFC0000000
|
|
%inbounds = and i1 %positive, %withinmax
|
|
%saturated = sext i1 %positive to i32
|
|
%normal = fptoui float %v to i32
|
|
%0 = select i1 %inbounds, i32 %normal, i32 %saturated
|
|
ret i32 %0
|
|
}
|
|
|
|
define hidden float @main.maxu32f(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret float 0x41F0000000000000
|
|
}
|
|
|
|
define hidden i32 @main.maxu32tof32(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret i32 -1
|
|
}
|
|
|
|
define hidden { i32, i32, i32, i32 } @main.inftoi32(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret { i32, i32, i32, i32 } { i32 -1, i32 0, i32 2147483647, i32 -2147483648 }
|
|
}
|
|
|
|
define hidden i32 @main.u32tof32tou32(i32 %v, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = uitofp i32 %v to float
|
|
%withinmax = fcmp ole float %0, 0x41EFFFFFC0000000
|
|
%normal = fptoui float %0 to i32
|
|
%1 = select i1 %withinmax, i32 %normal, i32 -1
|
|
ret i32 %1
|
|
}
|
|
|
|
define hidden float @main.f32tou32tof32(float %v, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%positive = fcmp oge float %v, 0.000000e+00
|
|
%withinmax = fcmp ole float %v, 0x41EFFFFFC0000000
|
|
%inbounds = and i1 %positive, %withinmax
|
|
%saturated = sext i1 %positive to i32
|
|
%normal = fptoui float %v to i32
|
|
%0 = select i1 %inbounds, i32 %normal, i32 %saturated
|
|
%1 = uitofp i32 %0 to float
|
|
ret float %1
|
|
}
|
|
|
|
define hidden i8 @main.f32tou8(float %v, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%positive = fcmp oge float %v, 0.000000e+00
|
|
%withinmax = fcmp ole float %v, 2.550000e+02
|
|
%inbounds = and i1 %positive, %withinmax
|
|
%saturated = sext i1 %positive to i8
|
|
%normal = fptoui float %v to i8
|
|
%0 = select i1 %inbounds, i8 %normal, i8 %saturated
|
|
ret i8 %0
|
|
}
|
|
|
|
define hidden i8 @main.f32toi8(float %v, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%abovemin = fcmp oge float %v, -1.280000e+02
|
|
%belowmax = fcmp ole float %v, 1.270000e+02
|
|
%inbounds = and i1 %abovemin, %belowmax
|
|
%saturated = select i1 %abovemin, i8 127, i8 -128
|
|
%isnan = fcmp uno float %v, 0.000000e+00
|
|
%remapped = select i1 %isnan, i8 0, i8 %saturated
|
|
%normal = fptosi float %v to i8
|
|
%0 = select i1 %inbounds, i8 %normal, i8 %remapped
|
|
ret i8 %0
|
|
}
|