mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
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:
parent
1940dd10dd
commit
19f047f5f6
@ -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"
|
||||
|
||||
|
@ -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].
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user