Skip to content

Commit 3132729

Browse files
committed
add copysign
1 parent a716731 commit 3132729

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

ir/instr.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ void FpBinOp::print(ostream &os) const {
596596
case FMin: str = "fmin "; break;
597597
case FMaximum: str = "fmaximum "; break;
598598
case FMinimum: str = "fminimum "; break;
599+
case CopySign: str = "copysign "; break;
599600
}
600601
os << getName() << " = " << str << fmath << *lhs << ", " << rhs->getName()
601602
<< ", rounding=" << rm;
@@ -806,6 +807,15 @@ StateValue FpBinOp::toSMT(State &s) const {
806807
return fm_poison(s, a, ap, b, bp, v, fmath, false);
807808
};
808809
break;
810+
case CopySign:
811+
fn = [&](auto &a, auto &ap, auto &b, auto &bp, auto rm) -> StateValue {
812+
return fm_poison(s, a, ap, b, bp,
813+
[](expr &a, expr &b) {
814+
return expr::mkIf(a.isFPNegative() == b.isFPNegative(),
815+
a, a.fneg()); },
816+
fmath, false);
817+
};
818+
break;
809819
}
810820

811821
auto scalar = [&](auto &a, auto &ap, auto &b, auto &bp) {

ir/instr.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ class BinOp final : public Instr {
5858

5959
class FpBinOp final : public Instr {
6060
public:
61-
enum Op { FAdd, FSub, FMul, FDiv, FRem, FMax, FMin, FMaximum, FMinimum };
61+
enum Op { FAdd, FSub, FMul, FDiv, FRem, FMax, FMin, FMaximum, FMinimum,
62+
CopySign };
6263

6364
private:
6465
Value *lhs, *rhs;

llvm_util/known_fns.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ known_call(llvm::CallInst &i, const llvm::TargetLibraryInfo &TLI,
190190
RETURN_VAL(make_unique<FpUnaryOp>(*ty, value_name(i), *args[0],
191191
FpUnaryOp::Trunc, parse_fmath(i)));
192192

193+
case llvm::LibFunc_copysign:
194+
case llvm::LibFunc_copysignf:
195+
RETURN_VAL(make_unique<FpBinOp>(*ty, value_name(i), *args[0], *args[1],
196+
FpBinOp::CopySign, parse_fmath(i)));
197+
193198
case llvm::LibFunc_sqrt:
194199
case llvm::LibFunc_sqrtf:
195200
BB.addInstr(make_unique<Assume>(*args[0], Assume::WellDefined));

llvm_util/llvm2alive.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,7 @@ class llvm2alive_ : public llvm::InstVisitor<llvm2alive_, unique_ptr<Instr>> {
920920
make_unique<FpTernaryOp>(*ty, value_name(i), *a, *b, *c, op,
921921
parse_fmath(i), parse_rounding(i)));
922922
}
923+
case llvm::Intrinsic::copysign:
923924
case llvm::Intrinsic::minnum:
924925
case llvm::Intrinsic::maxnum:
925926
case llvm::Intrinsic::minimum:
@@ -936,6 +937,7 @@ class llvm2alive_ : public llvm::InstVisitor<llvm2alive_, unique_ptr<Instr>> {
936937
PARSE_BINOP();
937938
FpBinOp::Op op;
938939
switch (i.getIntrinsicID()) {
940+
case llvm::Intrinsic::copysign: op = FpBinOp::CopySign; break;
939941
case llvm::Intrinsic::minnum:
940942
case llvm::Intrinsic::experimental_constrained_minnum: op = FpBinOp::FMin; break;
941943
case llvm::Intrinsic::maxnum:

0 commit comments

Comments
 (0)