Add {u,s}{add,sub,mul}_overflow instructions (#5784)
* add `{u,s}{add,sub,mul}_overflow` with interpreter
* add `{u,s}{add,sub,mul}_overflow` for x64
* add `{u,s}{add,sub,mul}_overflow` for aarch64
* 128bit filetests for `{u,s}{add,sub,mul}_overflow`
* `{u,s}{add,sub,mul}_overflow` emit tests for x64
* `{u,s}{add,sub,mul}_overflow` emit tests for aarch64
* Initial review changes
* add `with_flags_extended` helper
* add `with_flags_chained` helper
This commit is contained in:
85
cranelift/filetests/filetests/runtests/sadd_overflow.clif
Normal file
85
cranelift/filetests/filetests/runtests/sadd_overflow.clif
Normal file
@@ -0,0 +1,85 @@
|
||||
test interpret
|
||||
test run
|
||||
set enable_llvm_abi_extensions=true
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %saddof_i128(i128, i128) -> i128, i8 {
|
||||
block0(v0: i128,v1: i128):
|
||||
v2, v3 = sadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %saddof_i128(0, 0) == [0, 0]
|
||||
; run: %saddof_i128(1, 0) == [1, 0]
|
||||
; run: %saddof_i128(1, 1) == [2, 0]
|
||||
; run: %saddof_i128(1, -1) == [0, 0]
|
||||
; run: %saddof_i128(0xFFFFFFFF_FFFFFFFF_00000000_00000000, 0x00000000_00000000_FFFFFFFF_FFFFFFFF) == [-1, 0]
|
||||
; run: %saddof_i128(0x00000000_00000000_FFFFFFFF_FFFFFFFF, 1) == [0x1_00000000_00000000, 0]
|
||||
; run: %saddof_i128(-1, 1) == [0, 0]
|
||||
; run: %saddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF) == [-2, 1]
|
||||
; run: %saddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000000) == [-1, 0]
|
||||
; run: %saddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000001) == [0, 0]
|
||||
; run: %saddof_i128(0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000000) == [0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 1]
|
||||
; run: %saddof_i128(0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000001) == [0x80000000_00000000_00000000_00000000, 0]
|
||||
; run: %saddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 1) == [0x80000000_00000000_00000000_00000000, 1]
|
||||
; run: %saddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE, 1) == [0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0]
|
||||
; run: %saddof_i128(0x01234567_89ABCDEF_01234567_89ABCDEF, 0xFEDCBA98_76543210_FEDCBA98_76543210) == [-1, 0]
|
||||
; run: %saddof_i128(0x06060606_06060606_A00A00A0_0A00A00A, 0x30303030_30303030_0BB0BB0B_B0BB0BB0) == [0x36363636_36363636_ABBABBAB_BABBABBA, 0]
|
||||
; run: %saddof_i128(0xC0FFEEEE_C0FFEEEE_C0FFEEEE_C0FFEEEE, 0x1DCB1111_1DCB1111_1DCB1111_1DCB1111) == [0xDECAFFFF_DECAFFFF_DECAFFFF_DECAFFFF, 0]
|
||||
|
||||
function %saddof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64,v1: i64):
|
||||
v2, v3 = sadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %saddof_i64(0, 0) == [0, 0]
|
||||
; run: %saddof_i64(0, 1) == [1, 0]
|
||||
; run: %saddof_i64(-1, 0) == [-1, 0]
|
||||
; run: %saddof_i64(-1, 1) == [0, 0]
|
||||
; run: %saddof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [-2, 1]
|
||||
; run: %saddof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000000) == [-1, 0]
|
||||
; run: %saddof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000001) == [0, 0]
|
||||
; run: %saddof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [-1, 0]
|
||||
; run: %saddof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543220) == [0xF, 0]
|
||||
; run: %saddof_i64(0xA00A00A0_0A00A00A, 0x0BB0BB0B_B0BB0BB0) == [0xABBABBAB_BABBABBA, 0]
|
||||
; run: %saddof_i64(0xC0FFEEEE_C0FFEEEE, 0x1DCB1111_1DCB1111) == [0xDECAFFFF_DECAFFFF, 0]
|
||||
|
||||
function %saddof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = sadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %saddof_i8(0, 1) == [1, 0]
|
||||
; run: %saddof_i8(100, 27) == [127, 0]
|
||||
; run: %saddof_i8(100, -20) == [80, 0]
|
||||
; run: %saddof_i8(100, 28) == [-128, 1]
|
||||
; run: %saddof_i8(-128, -128) == [0, 1]
|
||||
; run: %saddof_i8(-128, -1) == [0x7F, 1]
|
||||
; run: %saddof_i8(-127, -1) == [-128, 0]
|
||||
; run: %saddof_i8(127, 1) == [0x80, 1]
|
||||
|
||||
function %saddof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = sadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %saddof_i16(0, 1) == [1, 0]
|
||||
; run: %saddof_i16(100, 27) == [127, 0]
|
||||
; run: %saddof_i16(100, 28) == [128, 0]
|
||||
; run: %saddof_i16(32000, 767) == [32767, 0]
|
||||
; run: %saddof_i16(32000, 768) == [-32768, 1]
|
||||
; run: %saddof_i16(-32767, -1) == [-32768, 0]
|
||||
; run: %saddof_i16(-32768, -1) == [32767, 1]
|
||||
|
||||
function %saddof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = sadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %saddof_i32(0, 1) == [1, 0]
|
||||
; run: %saddof_i32(100, 27) == [127, 0]
|
||||
; run: %saddof_i32(100, 28) == [128, 0]
|
||||
; run: %saddof_i32(0x7FFF_FFFE, 1) == [0x7FFF_FFFF, 0]
|
||||
; run: %saddof_i32(0x7FFF_FFFF, 1) == [0x8000_0000, 1]
|
||||
; run: %saddof_i32(0x8000_0000, 0xFFFF_FFFF) == [0x7FFF_FFFF, 1]
|
||||
; run: %saddof_i32(0x8000_0001, 0xFFFF_FFFF) == [0x8000_0000, 0]
|
||||
76
cranelift/filetests/filetests/runtests/smul_overflow.clif
Normal file
76
cranelift/filetests/filetests/runtests/smul_overflow.clif
Normal file
@@ -0,0 +1,76 @@
|
||||
test interpret
|
||||
test run
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %smulof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64, v1: i64):
|
||||
v2, v3 = smul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %smulof_i64(0, 1) == [0, 0]
|
||||
; run: %smulof_i64(1, 1) == [1, 0]
|
||||
; run: %smulof_i64(0xFFFFFFFF_FFFFFFFF, 2) == [0xFFFFFFFF_FFFFFFFE, 0]
|
||||
; run: %smulof_i64(0x7FFFFFFF_FFFFFFFF, 2) == [0xFFFFFFFF_FFFFFFFE, 1]
|
||||
; run: %smulof_i64(1, -1) == [-1, 0]
|
||||
; run: %smulof_i64(2, 2) == [4, 0]
|
||||
; run: %smulof_i64(2, -2) == [-4, 0]
|
||||
; run: %smulof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [1, 1]
|
||||
; run: %smulof_i64(0x80000000_00000000, 0x7FFFFFFF_FFFFFFFF) == [0x80000000_00000000, 1]
|
||||
; run: %smulof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [0x2236D88F_E5618CF0, 1]
|
||||
; run: %smulof_i64(0xC0FFEEEE_C0FFEEEE, 0xDECAFFFF_DECAFFFF) == [0xDB6B1E48_19BA1112, 1]
|
||||
|
||||
function %smulof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = smul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %smulof_i32(0, 1) == [0, 0]
|
||||
; run: %smulof_i32(1, 1) == [1, 0]
|
||||
; run: %smulof_i32(0xFFFFFFFF, 2) == [0xFFFFFFFE, 0]
|
||||
; run: %smulof_i32(0x7FFFFFFF, 2) == [0xFFFFFFFE, 1]
|
||||
; run: %smulof_i32(1, -1) == [-1, 0]
|
||||
; run: %smulof_i32(2, 2) == [4, 0]
|
||||
; run: %smulof_i32(2, -2) == [-4, 0]
|
||||
; run: %smulof_i32(0x7FFFFFFF, 0x7FFFFFFF) == [1, 1]
|
||||
; run: %smulof_i32(0x80000000, 0x7FFFFFFF) == [0x80000000, 1]
|
||||
; run: %smulof_i32(0x01234567, 0xFEDCBA98) == [0x23E20B28, 1]
|
||||
; run: %smulof_i32(0xC0FFEEEE, 0xDECAFFFF) == [0x19BA1112, 1]
|
||||
|
||||
function %smulof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = smul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %smulof_i16(0, 1) == [0, 0]
|
||||
; run: %smulof_i16(1, 1) == [1, 0]
|
||||
; run: %smulof_i16(0xFFFF, 2) == [0xFFFE, 0]
|
||||
; run: %smulof_i16(0x7FFF, 2) == [0xFFFE, 1]
|
||||
; run: %smulof_i16(1, -1) == [-1, 0]
|
||||
; run: %smulof_i16(2, 2) == [4, 0]
|
||||
; run: %smulof_i16(2, -2) == [-4, 0]
|
||||
; run: %smulof_i16(0x7FFF, 0x7FFF) == [1, 1]
|
||||
; run: %smulof_i16(0x8000, 0x7FFF) == [0x8000, 1]
|
||||
; run: %smulof_i16(0x0123, 0xFEDC) == [0xB414, 1]
|
||||
; run: %smulof_i16(0xC0FF, 0xDECA) == [0x6B36, 1]
|
||||
|
||||
function %smulof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = smul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %smulof_i8(0, 1) == [0, 0]
|
||||
; run: %smulof_i8(1, 1) == [1, 0]
|
||||
; run: %smulof_i8(0xFF, 2) == [0xFE, 0]
|
||||
; run: %smulof_i8(0x7F, 2) == [0xFE, 1]
|
||||
; run: %smulof_i8(1, -1) == [-1, 0]
|
||||
; run: %smulof_i8(2, 2) == [4, 0]
|
||||
; run: %smulof_i8(2, -2) == [-4, 0]
|
||||
; run: %smulof_i8(0x7F, 0x7F) == [1, 1]
|
||||
; run: %smulof_i8(0x80, 0x7F) == [0x80, 1]
|
||||
; run: %smulof_i8(0x01, 0xFE) == [0xFE, 0]
|
||||
; run: %smulof_i8(0xC0, 0xDE) == [0x80, 1]
|
||||
91
cranelift/filetests/filetests/runtests/ssub_overflow.clif
Normal file
91
cranelift/filetests/filetests/runtests/ssub_overflow.clif
Normal file
@@ -0,0 +1,91 @@
|
||||
test interpret
|
||||
test run
|
||||
set enable_llvm_abi_extensions=true
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %ssubof_i128(i128, i128) -> i128, i8 {
|
||||
block0(v0: i128,v1: i128):
|
||||
v2, v3 = ssub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %ssubof_i128(0, 0) == [0, 0]
|
||||
; run: %ssubof_i128(0, 1) == [-1, 0]
|
||||
; run: %ssubof_i128(-1, 0) == [-1, 0]
|
||||
; run: %ssubof_i128(-1, 1) == [-2, 0]
|
||||
; run: %ssubof_i128(-1, -2) == [1, 0]
|
||||
; run: %ssubof_i128(0x00000000_00000001_00000000_00000000, 1) == [0xFFFFFFFF_FFFFFFFF, 0]
|
||||
; run: %ssubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF) == [0, 0]
|
||||
; run: %ssubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000000) == [-1, 1]
|
||||
; run: %ssubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000001) == [-2, 1]
|
||||
; run: %ssubof_i128(0, 0x80000000_00000000_00000000_00000000) == [0x80000000_00000000_00000000_00000000, 1]
|
||||
; run: %ssubof_i128(0x80000000_00000000_00000000_00000000, 1) == [0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 1]
|
||||
; run: %ssubof_i128(0x80000000_00000000_00000000_00000001, 1) == [0x80000000_00000000_00000000_00000000, 0]
|
||||
|
||||
function %ssubof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64,v1: i64):
|
||||
v2, v3 = ssub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %ssubof_i64(0, 0) == [0, 0]
|
||||
; run: %ssubof_i64(0, 1) == [-1, 0]
|
||||
; run: %ssubof_i64(-1, 0) == [-1, 0]
|
||||
; run: %ssubof_i64(-1, 1) == [-2, 0]
|
||||
; run: %ssubof_i64(-1, -2) == [1, 0]
|
||||
; run: %ssubof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [0, 0]
|
||||
; run: %ssubof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000000) == [-1, 1]
|
||||
; run: %ssubof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000001) == [-2, 1]
|
||||
; run: %ssubof_i64(0, 0x80000000_00000000) == [0x80000000_00000000, 1]
|
||||
; run: %ssubof_i64(0x80000000_00000000, 1) == [0x7FFFFFFF_FFFFFFFF, 1]
|
||||
; run: %ssubof_i64(0x80000000_00000001, 1) == [0x80000000_00000000, 0]
|
||||
; run: %ssubof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [0x0246_8ACF_1357_9BDF, 0]
|
||||
; run: %ssubof_i64(0xFEDCBA98_76543220, 0x01234567_89ABCDEF) == [0xFDB9_7530_ECA8_6431, 0]
|
||||
|
||||
function %ssubof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = ssub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %ssubof_i8(0, 1) == [-1, 0]
|
||||
; run: %ssubof_i8(100, 20) == [80, 0]
|
||||
; run: %ssubof_i8(100, -20) == [120, 0]
|
||||
; run: %ssubof_i8(0x80, 0x80) == [0, 0]
|
||||
; run: %ssubof_i8(0x7F, 0x80) == [0xFF, 1]
|
||||
; run: %ssubof_i8(0, 0x80) == [0x80, 1]
|
||||
; run: %ssubof_i8(0x80, 0x80) == [0, 0]
|
||||
; run: %ssubof_i8(0x80, 0x01) == [0x7F, 1]
|
||||
; run: %ssubof_i8(0x7F, 0xFF) == [0x80, 1]
|
||||
; run: %ssubof_i8(0x7E, 0xFF) == [0x7F, 0]
|
||||
; run: %ssubof_i8(0x80, 1) == [0x7F, 1]
|
||||
|
||||
function %ssubof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = ssub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %ssubof_i16(0, 1) == [-1, 0]
|
||||
; run: %ssubof_i16(100, 20) == [80, 0]
|
||||
; run: %ssubof_i16(0xFFFF, 0xFFFF) == [0, 0]
|
||||
; run: %ssubof_i16(0xFFFE, 0xFFFF) == [-1, 0]
|
||||
; run: %ssubof_i16(0xFFFE, 0xFE) == [0xFF00, 0]
|
||||
; run: %ssubof_i16(0, 0x8000) == [0x8000, 1]
|
||||
; run: %ssubof_i16(0x8000, 0x0001) == [0x7FFF, 1]
|
||||
; run: %ssubof_i16(0x8000, 0xFFFF) == [0x8001, 0]
|
||||
; run: %ssubof_i16(0x7FFF, 0xFFFF) == [0x8000, 1]
|
||||
; run: %ssubof_i16(0x7FFE, 0xFFFF) == [0x7FFF, 0]
|
||||
|
||||
function %ssubof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = ssub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %ssubof_i32(0, 1) == [-1, 0]
|
||||
; run: %ssubof_i32(100, 20) == [80, 0]
|
||||
; run: %ssubof_i32(0xFFFF_FFFF, 0xFFFF_FFFF) == [0, 0]
|
||||
; run: %ssubof_i32(0, 0x8000_0000) == [0x8000_0000, 1]
|
||||
; run: %ssubof_i32(0x8000_0000, 0x0000_0001) == [0x7FFF_FFFF, 1]
|
||||
; run: %ssubof_i32(0x8000_0000, 0xFFFF_FFFF) == [0x8000_0001, 0]
|
||||
; run: %ssubof_i32(0xFFFF_FFFE, 0xFFFF_FFFF) == [-1, 0]
|
||||
; run: %ssubof_i32(0xFFFF_FFFE, 0xFE) == [0xFFFF_FF00, 0]
|
||||
; run: %ssubof_i32(0x7FFF_FFFF, 0xFFFF_FFFF) == [0x8000_0000, 1]
|
||||
; run: %ssubof_i32(0x7FFF_FFFE, 0xFFFF_FFFF) == [0x7FFF_FFFF, 0]
|
||||
77
cranelift/filetests/filetests/runtests/uadd_overflow.clif
Normal file
77
cranelift/filetests/filetests/runtests/uadd_overflow.clif
Normal file
@@ -0,0 +1,77 @@
|
||||
test interpret
|
||||
test run
|
||||
set enable_llvm_abi_extensions=true
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %uaddof_i128(i128, i128) -> i128, i8 {
|
||||
block0(v0: i128,v1: i128):
|
||||
v2, v3 = uadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %uaddof_i128(0, 0) == [0, 0]
|
||||
; run: %uaddof_i128(1, 0) == [1, 0]
|
||||
; run: %uaddof_i128(1, 1) == [2, 0]
|
||||
; run: %uaddof_i128(1, -1) == [0, 1]
|
||||
; run: %uaddof_i128(0xFFFFFFFF_FFFFFFFF_00000000_00000000, 0x00000000_00000000_FFFFFFFF_FFFFFFFF) == [-1, 0]
|
||||
; run: %uaddof_i128(0x00000000_00000000_FFFFFFFF_FFFFFFFF, 1) == [0x1_00000000_00000000, 0]
|
||||
; run: %uaddof_i128(-1, 1) == [0, 1]
|
||||
; run: %uaddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF) == [-2, 0]
|
||||
; run: %uaddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000000) == [-1, 0]
|
||||
; run: %uaddof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000001) == [0, 1]
|
||||
; run: %uaddof_i128(0x01234567_89ABCDEF_01234567_89ABCDEF, 0xFEDCBA98_76543210_FEDCBA98_76543210) == [-1, 0]
|
||||
; run: %uaddof_i128(0x06060606_06060606_A00A00A0_0A00A00A, 0x30303030_30303030_0BB0BB0B_B0BB0BB0) == [0x36363636_36363636_ABBABBAB_BABBABBA, 0]
|
||||
; run: %uaddof_i128(0xC0FFEEEE_C0FFEEEE_C0FFEEEE_C0FFEEEE, 0x1DCB1111_1DCB1111_1DCB1111_1DCB1111) == [0xDECAFFFF_DECAFFFF_DECAFFFF_DECAFFFF, 0]
|
||||
|
||||
function %uaddof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64,v1: i64):
|
||||
v2, v3 = uadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %uaddof_i64(0, 0) == [0, 0]
|
||||
; run: %uaddof_i64(0, 1) == [1, 0]
|
||||
; run: %uaddof_i64(-1, 0) == [-1, 0]
|
||||
; run: %uaddof_i64(-1, 1) == [0, 1]
|
||||
; run: %uaddof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [-2, 0]
|
||||
; run: %uaddof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000000) == [-1, 0]
|
||||
; run: %uaddof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000001) == [0, 1]
|
||||
; run: %uaddof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [-1, 0]
|
||||
; run: %uaddof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543220) == [0xF, 1]
|
||||
; run: %uaddof_i64(0xA00A00A0_0A00A00A, 0x0BB0BB0B_B0BB0BB0) == [0xABBABBAB_BABBABBA, 0]
|
||||
; run: %uaddof_i64(0xC0FFEEEE_C0FFEEEE, 0x1DCB1111_1DCB1111) == [0xDECAFFFF_DECAFFFF, 0]
|
||||
|
||||
function %uaddof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = uadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %uaddof_i8(0, 1) == [1, 0]
|
||||
; run: %uaddof_i8(100, 27) == [127, 0]
|
||||
; run: %uaddof_i8(100, -20) == [80, 1]
|
||||
; run: %uaddof_i8(100, 28) == [-128, 0]
|
||||
; run: %uaddof_i8(-128, -128) == [0, 1]
|
||||
; run: %uaddof_i8(127, 1) == [0x80, 0]
|
||||
|
||||
function %uaddof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = uadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %uaddof_i16(0, 1) == [1, 0]
|
||||
; run: %uaddof_i16(100, 27) == [127, 0]
|
||||
; run: %uaddof_i16(100, 28) == [128, 0]
|
||||
; run: %uaddof_i16(32000, 767) == [32767, 0]
|
||||
; run: %uaddof_i16(32000, 768) == [-32768, 0]
|
||||
; run: %uaddof_i16(65000, 535) == [65535, 0]
|
||||
; run: %uaddof_i16(65000, 536) == [0, 1]
|
||||
|
||||
function %uaddof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = uadd_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %uaddof_i32(0, 1) == [1, 0]
|
||||
; run: %uaddof_i32(100, 27) == [127, 0]
|
||||
; run: %uaddof_i32(100, 28) == [128, 0]
|
||||
; run: %uaddof_i32(3000000000, 1294967295) == [-1, 0]
|
||||
; run: %uaddof_i32(3000000000, 1294967296) == [0, 1]
|
||||
68
cranelift/filetests/filetests/runtests/umul_overflow.clif
Normal file
68
cranelift/filetests/filetests/runtests/umul_overflow.clif
Normal file
@@ -0,0 +1,68 @@
|
||||
test interpret
|
||||
test run
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %umulof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64, v1: i64):
|
||||
v2, v3 = umul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %umulof_i64(0, 1) == [0, 0]
|
||||
; run: %umulof_i64(1, 1) == [1, 0]
|
||||
; run: %umulof_i64(0xFFFFFFFF_FFFFFFFF, 2) == [0xFFFFFFFF_FFFFFFFE, 1]
|
||||
; run: %umulof_i64(1, -1) == [-1, 0]
|
||||
; run: %umulof_i64(2, 2) == [4, 0]
|
||||
; run: %umulof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [1, 1]
|
||||
; run: %umulof_i64(0x80000000_00000000, 0x7FFFFFFF_FFFFFFFF) == [0x80000000_00000000, 1]
|
||||
; run: %umulof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [0x2236D88F_E5618CF0, 1]
|
||||
; run: %umulof_i64(0xC0FFEEEE_C0FFEEEE, 0xDECAFFFF_DECAFFFF) == [0xDB6B1E48_19BA1112, 1]
|
||||
|
||||
function %umulof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = umul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %umulof_i32(0, 1) == [0, 0]
|
||||
; run: %umulof_i32(1, 1) == [1, 0]
|
||||
; run: %umulof_i32(0xFFFFFFFF, 2) == [0xFFFFFFFE, 1]
|
||||
; run: %umulof_i32(1, -1) == [-1, 0]
|
||||
; run: %umulof_i32(2, 2) == [4, 0]
|
||||
; run: %umulof_i32(0x7FFFFFFF, 0x7FFFFFFF) == [1, 1]
|
||||
; run: %umulof_i32(0x80000000, 0x7FFFFFFF) == [0x80000000, 1]
|
||||
; run: %umulof_i32(0x01234567, 0xFEDCBA98) == [0x23E20B28, 1]
|
||||
; run: %umulof_i32(0xC0FFEEEE, 0xDECAFFFF) == [0x19BA1112, 1]
|
||||
|
||||
function %umulof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = umul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %umulof_i16(0, 1) == [0, 0]
|
||||
; run: %umulof_i16(1, 1) == [1, 0]
|
||||
; run: %umulof_i16(0xFFFF, 2) == [0xFFFE, 1]
|
||||
; run: %umulof_i16(1, -1) == [-1, 0]
|
||||
; run: %umulof_i16(2, 2) == [4, 0]
|
||||
; run: %umulof_i16(0x7FFF, 0x7FFF) == [1, 1]
|
||||
; run: %umulof_i16(0x8000, 0x7FFF) == [0x8000, 1]
|
||||
; run: %umulof_i16(0x0123, 0xFEDC) == [0xB414, 1]
|
||||
; run: %umulof_i16(0xC0FF, 0xDECA) == [0x6B36, 1]
|
||||
|
||||
function %umulof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = umul_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
|
||||
; run: %umulof_i8(0, 1) == [0, 0]
|
||||
; run: %umulof_i8(1, 1) == [1, 0]
|
||||
; run: %umulof_i8(0xFF, 2) == [0xFE, 1]
|
||||
; run: %umulof_i8(1, -1) == [-1, 0]
|
||||
; run: %umulof_i8(2, 2) == [4, 0]
|
||||
; run: %umulof_i8(0x7F, 0x7F) == [1, 1]
|
||||
; run: %umulof_i8(0x80, 0x7F) == [0x80, 1]
|
||||
; run: %umulof_i8(0x01, 0xFE) == [0xFE, 0]
|
||||
; run: %umulof_i8(0xC0, 0xDE) == [0x80, 1]
|
||||
74
cranelift/filetests/filetests/runtests/usub_overflow.clif
Normal file
74
cranelift/filetests/filetests/runtests/usub_overflow.clif
Normal file
@@ -0,0 +1,74 @@
|
||||
test interpret
|
||||
test run
|
||||
set enable_llvm_abi_extensions=true
|
||||
target x86_64
|
||||
target aarch64
|
||||
|
||||
function %usubof_i128(i128, i128) -> i128, i8 {
|
||||
block0(v0: i128,v1: i128):
|
||||
v2, v3 = usub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %usubof_i128(0, 0) == [0, 0]
|
||||
; run: %usubof_i128(0, 1) == [-1, 1]
|
||||
; run: %usubof_i128(-1, 0) == [-1, 0]
|
||||
; run: %usubof_i128(-1, 1) == [-2, 0]
|
||||
; run: %usubof_i128(-1, -2) == [1, 0]
|
||||
; run: %usubof_i128(0x00000000_00000001_00000000_00000000, 1) == [0xFFFFFFFF_FFFFFFFF, 0]
|
||||
; run: %usubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF) == [0, 0]
|
||||
; run: %usubof_i128(0x80000000_00000000_00000000_00000000, 1) == [0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0]
|
||||
; run: %usubof_i128(0x80000000_00000000_00000000_00000001, 1) == [0x80000000_00000000_00000000_00000000, 0]
|
||||
; run: %usubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000000) == [-1, 1]
|
||||
; run: %usubof_i128(0x7FFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF, 0x80000000_00000000_00000000_00000001) == [-2, 1]
|
||||
|
||||
function %usubof_i64(i64, i64) -> i64, i8 {
|
||||
block0(v0: i64,v1: i64):
|
||||
v2, v3 = usub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %usubof_i64(0, 0) == [0, 0]
|
||||
; run: %usubof_i64(0, 1) == [-1, 1]
|
||||
; run: %usubof_i64(-1, 0) == [-1, 0]
|
||||
; run: %usubof_i64(-1, 1) == [-2, 0]
|
||||
; run: %usubof_i64(-1, -2) == [1, 0]
|
||||
; run: %usubof_i64(0x7FFFFFFF_FFFFFFFF, 0x7FFFFFFF_FFFFFFFF) == [0, 0]
|
||||
; run: %usubof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000000) == [-1, 1]
|
||||
; run: %usubof_i64(0x7FFFFFFF_FFFFFFFF, 0x80000000_00000001) == [-2, 1]
|
||||
; run: %usubof_i64(0x01234567_89ABCDEF, 0xFEDCBA98_76543210) == [0x0246_8ACF_1357_9BDF, 1]
|
||||
; run: %usubof_i64(0xFEDCBA98_76543220, 0x01234567_89ABCDEF) == [0xFDB9_7530_ECA8_6431, 0]
|
||||
|
||||
function %usubof_i8(i8, i8) -> i8, i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2, v3 = usub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %usubof_i8(0, 1) == [-1, 1]
|
||||
; run: %usubof_i8(100, 20) == [80, 0]
|
||||
; run: %usubof_i8(100, -20) == [120, 1]
|
||||
; run: %usubof_i8(127, -128) == [-1, 1]
|
||||
; run: %usubof_i8(0x80, 0x80) == [0, 0]
|
||||
; run: %usubof_i8(0xFF, 0xFF) == [0, 0]
|
||||
; run: %usubof_i8(0xFE, 0xFF) == [0xFF, 1]
|
||||
; run: %usubof_i8(0x80, 1) == [0x7F, 0]
|
||||
|
||||
function %usubof_i16(i16, i16) -> i16, i8 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2, v3 = usub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %usubof_i16(0, 1) == [-1, 1]
|
||||
; run: %usubof_i16(100, 20) == [80, 0]
|
||||
; run: %usubof_i16(0xFFFF, 0xFFFF) == [0, 0]
|
||||
; run: %usubof_i16(0xFFFE, 0xFFFF) == [-1, 1]
|
||||
; run: %usubof_i16(0xFFFE, 0xFE) == [0xFF00, 0]
|
||||
|
||||
function %usubof_i32(i32, i32) -> i32, i8 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2, v3 = usub_overflow v0, v1
|
||||
return v2, v3
|
||||
}
|
||||
; run: %usubof_i32(0, 1) == [-1, 1]
|
||||
; run: %usubof_i32(100, 20) == [80, 0]
|
||||
; run: %usubof_i32(0xFFFF_FFFF, 0xFFFF_FFFF) == [0, 0]
|
||||
; run: %usubof_i32(0xFFFF_FFFE, 0xFFFF_FFFF) == [-1, 1]
|
||||
; run: %usubof_i32(0xFFFF_FFFE, 0xFE) == [0xFFFF_FF00, 0]
|
||||
Reference in New Issue
Block a user