Add the new builder arthmetic instructions to llvm-c and ocaml.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97372 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Erick Tryzelaar 2010-02-28 05:51:43 +00:00
parent 1940dd10dd
commit 19f047f5f6
6 changed files with 320 additions and 1 deletions

View File

@ -270,14 +270,21 @@ external const_union : lltype -> llvalue -> llvalue = "LLVMConstUnion"
external align_of : lltype -> llvalue = "LLVMAlignOf"
external size_of : lltype -> llvalue = "LLVMSizeOf"
external const_neg : llvalue -> llvalue = "LLVMConstNeg"
external const_nsw_neg : llvalue -> llvalue = "LLVMConstNSWNeg"
external const_nuw_neg : llvalue -> llvalue = "LLVMConstNUWNeg"
external const_fneg : llvalue -> llvalue = "LLVMConstFNeg"
external const_not : llvalue -> llvalue = "LLVMConstNot"
external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd"
external const_nsw_add : llvalue -> llvalue -> llvalue = "LLVMConstNSWAdd"
external const_nuw_add : llvalue -> llvalue -> llvalue = "LLVMConstNUWAdd"
external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd"
external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub"
external const_nsw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNSWSub"
external const_nuw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNUWSub"
external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub"
external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul"
external const_nsw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNSWMul"
external const_nuw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNUWMul"
external const_fmul : llvalue -> llvalue -> llvalue = "LLVMConstFMul"
external const_udiv : llvalue -> llvalue -> llvalue = "LLVMConstUDiv"
external const_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstSDiv"
@ -711,14 +718,24 @@ external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_add"
external build_nsw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_add"
external build_nuw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_add"
external build_fadd : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_fadd"
external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_sub"
external build_nsw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_sub"
external build_nuw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_sub"
external build_fsub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_fsub"
external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_mul"
external build_nsw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_mul"
external build_nuw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_mul"
external build_fmul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_fmul"
external build_udiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
@ -749,6 +766,12 @@ external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_xor"
external build_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_neg"
external build_nsw_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_neg"
external build_nuw_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_neg"
external build_fneg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_fneg"
external build_not : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_not"

View File

@ -615,6 +615,16 @@ external size_of : lltype -> llvalue = "LLVMSizeOf"
See the method [llvm::ConstantExpr::getNeg]. *)
external const_neg : llvalue -> llvalue = "LLVMConstNeg"
(** [const_nsw_neg c] returns the arithmetic negation of the constant [c] with
no signed wrapping. The result is undefined if the negation overflows.
See the method [llvm::ConstantExpr::getNSWNeg]. *)
external const_nsw_neg : llvalue -> llvalue = "LLVMConstNSWNeg"
(** [const_nuw_neg c] returns the arithmetic negation of the constant [c] with
no unsigned wrapping. The result is undefined if the negation overflows.
See the method [llvm::ConstantExpr::getNUWNeg]. *)
external const_nuw_neg : llvalue -> llvalue = "LLVMConstNUWNeg"
(** [const_fneg c] returns the arithmetic negation of the constant float [c].
See the method [llvm::ConstantExpr::getFNeg]. *)
external const_fneg : llvalue -> llvalue = "LLVMConstFNeg"
@ -632,6 +642,11 @@ external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd"
See the method [llvm::ConstantExpr::getNSWAdd]. *)
external const_nsw_add : llvalue -> llvalue -> llvalue = "LLVMConstNSWAdd"
(** [const_nuw_add c1 c2] returns the constant sum of two constants with no
unsigned wrapping. The result is undefined if the sum overflows.
See the method [llvm::ConstantExpr::getNSWAdd]. *)
external const_nuw_add : llvalue -> llvalue -> llvalue = "LLVMConstNUWAdd"
(** [const_fadd c1 c2] returns the constant sum of two constant floats.
See the method [llvm::ConstantExpr::getFAdd]. *)
external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd"
@ -640,6 +655,16 @@ external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd"
constants. See the method [llvm::ConstantExpr::getSub]. *)
external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub"
(** [const_nsw_sub c1 c2] returns the constant difference of two constants with
no signed wrapping. The result is undefined if the sum overflows.
See the method [llvm::ConstantExpr::getNSWSub]. *)
external const_nsw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNSWSub"
(** [const_nuw_sub c1 c2] returns the constant difference of two constants with
no unsigned wrapping. The result is undefined if the sum overflows.
See the method [llvm::ConstantExpr::getNSWSub]. *)
external const_nuw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNUWSub"
(** [const_fsub c1 c2] returns the constant difference, [c1 - c2], of two
constant floats. See the method [llvm::ConstantExpr::getFSub]. *)
external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub"
@ -648,6 +673,16 @@ external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub"
See the method [llvm::ConstantExpr::getMul]. *)
external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul"
(** [const_nsw_mul c1 c2] returns the constant product of two constants with
no signed wrapping. The result is undefined if the sum overflows.
See the method [llvm::ConstantExpr::getNSWMul]. *)
external const_nsw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNSWMul"
(** [const_nuw_mul c1 c2] returns the constant product of two constants with
no unsigned wrapping. The result is undefined if the sum overflows.
See the method [llvm::ConstantExpr::getNSWMul]. *)
external const_nuw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNUWMul"
(** [const_fmul c1 c2] returns the constant product of two constants floats.
See the method [llvm::ConstantExpr::getFMul]. *)
external const_fmul : llvalue -> llvalue -> llvalue = "LLVMConstFMul"
@ -1502,6 +1537,13 @@ external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
external build_nsw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_add"
(** [build_nuw_add x y name b] creates a
[%name = nuw add %x, %y]
instruction at the position specified by the instruction builder [b].
See the method [llvm::LLVMBuilder::CreateNUWAdd]. *)
external build_nuw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_add"
(** [build_fadd x y name b] creates a
[%name = fadd %x, %y]
instruction at the position specified by the instruction builder [b].
@ -1516,6 +1558,20 @@ external build_fadd : llvalue -> llvalue -> string -> llbuilder -> llvalue
external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_sub"
(** [build_nsw_sub x y name b] creates a
[%name = nsw sub %x, %y]
instruction at the position specified by the instruction builder [b].
See the method [llvm::LLVMBuilder::CreateNSWSub]. *)
external build_nsw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_sub"
(** [build_nuw_sub x y name b] creates a
[%name = nuw sub %x, %y]
instruction at the position specified by the instruction builder [b].
See the method [llvm::LLVMBuilder::CreateNUWSub]. *)
external build_nuw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_sub"
(** [build_fsub x y name b] creates a
[%name = fsub %x, %y]
instruction at the position specified by the instruction builder [b].
@ -1530,6 +1586,20 @@ external build_fsub : llvalue -> llvalue -> string -> llbuilder -> llvalue
external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_mul"
(** [build_nsw_mul x y name b] creates a
[%name = nsw mul %x, %y]
instruction at the position specified by the instruction builder [b].
See the method [llvm::LLVMBuilder::CreateNSWMul]. *)
external build_nsw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_mul"
(** [build_nuw_mul x y name b] creates a
[%name = nuw mul %x, %y]
instruction at the position specified by the instruction builder [b].
See the method [llvm::LLVMBuilder::CreateNUWMul]. *)
external build_nuw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_mul"
(** [build_fmul x y name b] creates a
[%name = fmul %x, %y]
instruction at the position specified by the instruction builder [b].
@ -1636,6 +1706,30 @@ external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue
external build_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_neg"
(** [build_nsw_neg x name b] creates a
[%name = nsw sub 0, %x]
instruction at the position specified by the instruction builder [b].
[-0.0] is used for floating point types to compute the correct sign.
See the method [llvm::LLVMBuilder::CreateNeg]. *)
external build_nsw_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nsw_neg"
(** [build_nuw_neg x name b] creates a
[%name = nuw sub 0, %x]
instruction at the position specified by the instruction builder [b].
[-0.0] is used for floating point types to compute the correct sign.
See the method [llvm::LLVMBuilder::CreateNeg]. *)
external build_nuw_neg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_nuw_neg"
(** [build_fneg x name b] creates a
[%name = fsub 0, %x]
instruction at the position specified by the instruction builder [b].
[-0.0] is used for floating point types to compute the correct sign.
See the method [llvm::LLVMBuilder::CreateFNeg]. *)
external build_fneg : llvalue -> string -> llbuilder -> llvalue
= "llvm_build_fneg"
(** [build_xor x name b] creates a
[%name = xor %x, -1]
instruction at the position specified by the instruction builder [b].

View File

@ -1095,6 +1095,12 @@ CAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
@ -1107,6 +1113,18 @@ CAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
@ -1119,6 +1137,18 @@ CAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
}
/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
value Name, value B) {
@ -1209,6 +1239,24 @@ CAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
}
/* llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
value Name, value B) {
return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
}
/* llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
value Name, value B) {
return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
}
/* llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
value Name, value B) {
return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
}
/* llvalue -> string -> llbuilder -> llvalue */
CAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
value Name, value B) {

View File

@ -558,14 +558,21 @@ LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal);
LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal);
LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
@ -792,14 +799,24 @@ LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
@ -832,6 +849,10 @@ LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
const char *Name);
LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
const char *Name);
LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);

View File

@ -594,6 +594,17 @@ LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
unwrap<Constant>(ConstantVal)));
}
LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
return wrap(ConstantExpr::getNSWNeg(
unwrap<Constant>(ConstantVal)));
}
LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
return wrap(ConstantExpr::getNUWNeg(
unwrap<Constant>(ConstantVal)));
}
LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
return wrap(ConstantExpr::getFNeg(
unwrap<Constant>(ConstantVal)));
@ -617,6 +628,13 @@ LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getNUWAdd(
unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getFAdd(
unwrap<Constant>(LHSConstant),
@ -629,6 +647,20 @@ LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getNSWSub(
unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getNUWSub(
unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
@ -640,6 +672,20 @@ LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getNSWMul(
unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getNUWMul(
unwrap<Constant>(LHSConstant),
unwrap<Constant>(RHSConstant)));
}
LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
return wrap(ConstantExpr::getFMul(
unwrap<Constant>(LHSConstant),
@ -1628,6 +1674,11 @@ LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RH
return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
@ -1638,6 +1689,16 @@ LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
@ -1648,6 +1709,16 @@ LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
}
LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name) {
return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
@ -1729,6 +1800,16 @@ LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
}
LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
const char *Name) {
return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
}
LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
const char *Name) {
return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
}
LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
}

View File

@ -292,7 +292,7 @@ let test_constants () =
group "union";
let t = union_type context [| i1_type; i16_type; i64_type; double_type |] in
let c = const_union t one in
ignore (define_global "Const_union" c m);
ignore (define_global "const_union" c m);
insist (t = (type_of c));
(* RUN: grep {const_null.*zeroinit} < %t.ll
@ -318,12 +318,25 @@ let test_constants () =
group "constant arithmetic";
(* RUN: grep {@const_neg = global i64 sub} < %t.ll
* RUN: grep {@const_nsw_neg = global i64 sub nsw } < %t.ll
* RUN: grep {@const_nuw_neg = global i64 sub nuw } < %t.ll
* RUN: grep {@const_fneg = global double fsub } < %t.ll
* RUN: grep {@const_not = global i64 xor } < %t.ll
* RUN: grep {@const_add = global i64 add } < %t.ll
* RUN: grep {@const_nsw_add = global i64 add nsw } < %t.ll
* RUN: grep {@const_nuw_add = global i64 add nuw } < %t.ll
* RUN: grep {@const_fadd = global double fadd } < %t.ll
* RUN: grep {@const_sub = global i64 sub } < %t.ll
* RUN: grep {@const_nsw_sub = global i64 sub nsw } < %t.ll
* RUN: grep {@const_nuw_sub = global i64 sub nuw } < %t.ll
* RUN: grep {@const_fsub = global double fsub } < %t.ll
* RUN: grep {@const_mul = global i64 mul } < %t.ll
* RUN: grep {@const_nsw_mul = global i64 mul nsw } < %t.ll
* RUN: grep {@const_nuw_mul = global i64 mul nuw } < %t.ll
* RUN: grep {@const_fmul = global double fmul } < %t.ll
* RUN: grep {@const_udiv = global i64 udiv } < %t.ll
* RUN: grep {@const_sdiv = global i64 sdiv } < %t.ll
* RUN: grep {@const_exact_sdiv = global i64 sdiv exact } < %t.ll
* RUN: grep {@const_fdiv = global double fdiv } < %t.ll
* RUN: grep {@const_urem = global i64 urem } < %t.ll
* RUN: grep {@const_srem = global i64 srem } < %t.ll
@ -341,12 +354,25 @@ let test_constants () =
let foldbomb = const_ptrtoint foldbomb_gv i64_type in
let ffoldbomb = const_uitofp foldbomb double_type in
ignore (define_global "const_neg" (const_neg foldbomb) m);
ignore (define_global "const_nsw_neg" (const_nsw_neg foldbomb) m);
ignore (define_global "const_nuw_neg" (const_nuw_neg foldbomb) m);
ignore (define_global "const_fneg" (const_fneg ffoldbomb) m);
ignore (define_global "const_not" (const_not foldbomb) m);
ignore (define_global "const_add" (const_add foldbomb five) m);
ignore (define_global "const_nsw_add" (const_nsw_add foldbomb five) m);
ignore (define_global "const_nuw_add" (const_nuw_add foldbomb five) m);
ignore (define_global "const_fadd" (const_fadd ffoldbomb ffive) m);
ignore (define_global "const_sub" (const_sub foldbomb five) m);
ignore (define_global "const_nsw_sub" (const_nsw_sub foldbomb five) m);
ignore (define_global "const_nuw_sub" (const_nuw_sub foldbomb five) m);
ignore (define_global "const_fsub" (const_fsub ffoldbomb ffive) m);
ignore (define_global "const_mul" (const_mul foldbomb five) m);
ignore (define_global "const_nsw_mul" (const_nsw_mul foldbomb five) m);
ignore (define_global "const_nuw_mul" (const_nuw_mul foldbomb five) m);
ignore (define_global "const_fmul" (const_fmul ffoldbomb ffive) m);
ignore (define_global "const_udiv" (const_udiv foldbomb five) m);
ignore (define_global "const_sdiv" (const_sdiv foldbomb five) m);
ignore (define_global "const_exact_sdiv" (const_exact_sdiv foldbomb five) m);
ignore (define_global "const_fdiv" (const_fdiv ffoldbomb ffive) m);
ignore (define_global "const_urem" (const_urem foldbomb five) m);
ignore (define_global "const_srem" (const_srem foldbomb five) m);
@ -902,10 +928,20 @@ let test_builder () =
let b = builder_at_end context bb07 in
(* RUN: grep {%build_add = add i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nsw_add = add nsw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nuw_add = add nuw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_fadd = fadd float %F1, %F2} < %t.ll
* RUN: grep {%build_sub = sub i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nsw_sub = sub nsw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nuw_sub = sub nuw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_fsub = fsub float %F1, %F2} < %t.ll
* RUN: grep {%build_mul = mul i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nsw_mul = mul nsw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_nuw_mul = mul nuw i32 %P1, %P2} < %t.ll
* RUN: grep {%build_fmul = fmul float %F1, %F2} < %t.ll
* RUN: grep {%build_udiv = udiv i32 %P1, %P2} < %t.ll
* RUN: grep {%build_sdiv = sdiv i32 %P1, %P2} < %t.ll
* RUN: grep {%build_exact_sdiv = sdiv exact i32 %P1, %P2} < %t.ll
* RUN: grep {%build_fdiv = fdiv float %F1, %F2} < %t.ll
* RUN: grep {%build_urem = urem i32 %P1, %P2} < %t.ll
* RUN: grep {%build_srem = srem i32 %P1, %P2} < %t.ll
@ -917,13 +953,26 @@ let test_builder () =
* RUN: grep {%build_or = or i32 %P1, %P2} < %t.ll
* RUN: grep {%build_xor = xor i32 %P1, %P2} < %t.ll
* RUN: grep {%build_neg = sub i32 0, %P1} < %t.ll
* RUN: grep {%build_nsw_neg = sub nsw i32 0, %P1} < %t.ll
* RUN: grep {%build_nuw_neg = sub nuw i32 0, %P1} < %t.ll
* RUN: grep {%build_fneg = fsub float .*0.*, %F1} < %t.ll
* RUN: grep {%build_not = xor i32 %P1, -1} < %t.ll
*)
ignore (build_add p1 p2 "build_add" b);
ignore (build_nsw_add p1 p2 "build_nsw_add" b);
ignore (build_nuw_add p1 p2 "build_nuw_add" b);
ignore (build_fadd f1 f2 "build_fadd" b);
ignore (build_sub p1 p2 "build_sub" b);
ignore (build_nsw_sub p1 p2 "build_nsw_sub" b);
ignore (build_nuw_sub p1 p2 "build_nuw_sub" b);
ignore (build_fsub f1 f2 "build_fsub" b);
ignore (build_mul p1 p2 "build_mul" b);
ignore (build_nsw_mul p1 p2 "build_nsw_mul" b);
ignore (build_nuw_mul p1 p2 "build_nuw_mul" b);
ignore (build_fmul f1 f2 "build_fmul" b);
ignore (build_udiv p1 p2 "build_udiv" b);
ignore (build_sdiv p1 p2 "build_sdiv" b);
ignore (build_exact_sdiv p1 p2 "build_exact_sdiv" b);
ignore (build_fdiv f1 f2 "build_fdiv" b);
ignore (build_urem p1 p2 "build_urem" b);
ignore (build_srem p1 p2 "build_srem" b);
@ -935,6 +984,9 @@ let test_builder () =
ignore (build_or p1 p2 "build_or" b);
ignore (build_xor p1 p2 "build_xor" b);
ignore (build_neg p1 "build_neg" b);
ignore (build_nsw_neg p1 "build_nsw_neg" b);
ignore (build_nuw_neg p1 "build_nuw_neg" b);
ignore (build_fneg f1 "build_fneg" b);
ignore (build_not p1 "build_not" b);
ignore (build_unreachable b)
end;