blob: a52190d39c3062906bfc8d1de8b05677435f96a4 [file] [log] [blame]
// RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -S -emit-llvm \
// RUN: -fallow-half-arguments-and-returns %s -o - | \
// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-NOPT-SOFT
// RUN: %clang_cc1 -triple thumbv8m.main -O2 -mcmse -S -emit-llvm \
// RUN: -fallow-half-arguments-and-returns %s -o - | \
// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-OPT-SOFT
// RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -S -emit-llvm \
// RUN: -fallow-half-arguments-and-returns -mfloat-abi hard %s -o - | \
// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-NOPT-HARD
// RUN: %clang_cc1 -triple thumbv8m.main -O2 -mcmse -S -emit-llvm \
// RUN: -fallow-half-arguments-and-returns -mfloat-abi hard %s -o - | \
// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-OPT-HARD
__fp16 g0();
__attribute__((cmse_nonsecure_entry)) __fp16 f0() {
return g0();
}
// CHECK: define {{.*}}@f0()
// CHECK-NOPT-SOFT: %[[V0:.*]] = load i32
// CHECK-NOPT-SOFT: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-NOPT-SOFT: ret i32 %[[V1]]
// CHECK-OPT-SOFT: %[[V0:.*]] = tail call {{.*}} @g0
// CHECK-OPT-SOFT: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-OPT-SOFT: ret i32 %[[V1]]
// CHECK-NOPT-HARD: %[[V0:.*]] = bitcast float {{.*}} to i32
// CHECK-NOPT-HARD: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-NOPT-HARD: %[[V2:.*]] = bitcast i32 %[[V1]] to float
// CHECK-NOPT-HARD: ret float %[[V2]]
// CHECK-OPT-HARD: %[[V0:.*]] = bitcast float {{.*}} to i32
// CHECK-OPT-HARD: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-OPT-HARD: %[[V2:.*]] = bitcast i32 %[[V1]] to float
// CHECK-OPT-HARD: ret float %[[V2]]
void __attribute__((cmse_nonsecure_call)) (*g1)(__fp16);
__fp16 x;
void f1() {
g1(x);
}
// CHECK: define {{.*}}@f1()
// CHECK-NOPT-SOFT: %[[V0:.*]] = load i32
// CHECK-NOPT-SOFT: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-NOPT-SOFT: call {{.*}} void {{.*}}(i32 %[[V1]])
// CHECK-OPT-SOFT: %[[V1:.*]] = zext i16 {{.*}} to i32
// CHECK-OPT-SOFT: call {{.*}} void {{.*}}(i32 %[[V1]])
// CHECK-NOPT-HARD: %[[V0:.*]] = bitcast float {{.*}} to i32
// CHECK-NOPT-HARD: %[[V1:.*]] = and i32 %[[V0]], 65535
// CHECK-NOPT-HARD: %[[V2:.*]] = bitcast i32 %[[V1]] to float
// CHECK-NOPT-HARD: call {{.*}}(float %[[V2]])
// CHECK-OPT-HARD: %[[V0:.*]] = zext i16 {{.*}} to i32
// CHECK-OPT-HARD: %[[V1:.*]] = bitcast i32 %[[V0]] to float
// CHECK-OPT-HARD: call {{.*}}(float %[[V1]])