We have 3 different aproaches depending on the type of comparision requested: * For eq/ne we compare the high bits and low bits and check if they are equal * For overflow checks, we perform a i128 add and check the resulting overflow flag * For the remaining comparisions (gt/lt/sgt/etc...) We compare both the low bits and high bits, and if the high bits are equal we return the result of the unsigned comparision on the low bits As with other i128 ops, we are still missing immlogic support.
210 lines
8.2 KiB
Plaintext
210 lines
8.2 KiB
Plaintext
test run
|
|
target aarch64
|
|
target x86_64 machinst
|
|
|
|
; TODO: Cleanup these tests when we have native support for i128 immediates in CLIF's parser
|
|
function %icmp_eq_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 eq v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_eq_i128(0, 0, 0, 0) == true
|
|
; run: %icmp_eq_i128(-1, -1, -1, -1) == true
|
|
; run: %icmp_eq_i128(-1, -1, 0, 0) == false
|
|
; run: %icmp_eq_i128(-1, -1, 0, -1) == false
|
|
; run: %icmp_eq_i128(-1, 0, -1, -1) == false
|
|
; run: %icmp_eq_i128(0, -1, -1, -1) == false
|
|
; run: %icmp_eq_i128(0xC0FFEEEE_DECAFFFF, 0xDECAFFFF_C0FFEEEE, 0xC0FFEEEE_DECAFFFF, 0xDECAFFFF_C0FFEEEE) == true
|
|
; run: %icmp_eq_i128(0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0x00000000_00000001, 0x00000000_00000001) == false
|
|
; run: %icmp_eq_i128(0xFFFFFFFF_FFFFFFFF, 0x00000000_00000001, 0x00000000_00000001, 0x00000000_00000001) == false
|
|
|
|
function %icmp_ne_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 ne v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_ne_i128(0, 0, 0, 0) == false
|
|
; run: %icmp_ne_i128(-1, -1, -1, -1) == false
|
|
; run: %icmp_ne_i128(-1, -1, 0, 0) == true
|
|
; run: %icmp_ne_i128(-1, -1, 0, -1) == true
|
|
; run: %icmp_ne_i128(-1, 0, -1, -1) == true
|
|
; run: %icmp_ne_i128(0, -1, -1, -1) == true
|
|
; run: %icmp_ne_i128(0xC0FFEEEE_DECAFFFF, 0xDECAFFFF_C0FFEEEE, 0xC0FFEEEE_DECAFFFF, 0xDECAFFFF_C0FFEEEE) == false
|
|
; run: %icmp_ne_i128(0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0x00000000_00000001, 0x00000000_00000001) == true
|
|
; run: %icmp_ne_i128(0xFFFFFFFF_FFFFFFFF, 0x00000000_00000001, 0x00000000_00000001, 0x00000000_00000001) == true
|
|
|
|
|
|
function %icmp_slt_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 slt v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_slt_i128(0, 0, 0, 0) == false
|
|
; run: %icmp_slt_i128(1, 0, 1, 0) == false
|
|
; run: %icmp_slt_i128(0, 0, 1, 0) == true
|
|
; run: %icmp_slt_i128(-1, -1, 0, 0) == true
|
|
; run: %icmp_slt_i128(0, 0, -1, -1) == false
|
|
; run: %icmp_slt_i128(-1, -1, -1, -1) == false
|
|
; run: %icmp_slt_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == true
|
|
; run: %icmp_slt_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == true
|
|
; run: %icmp_slt_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == false
|
|
|
|
function %icmp_ult_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 ult v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_ult_i128(0, 0, 0, 0) == false
|
|
; run: %icmp_ult_i128(1, 0, 1, 0) == false
|
|
; run: %icmp_ult_i128(0, 0, 1, 0) == true
|
|
; run: %icmp_ult_i128(-1, -1, 0, 0) == false
|
|
; run: %icmp_ult_i128(0, 0, -1, -1) == true
|
|
; run: %icmp_ult_i128(-1, -1, -1, -1) == false
|
|
; run: %icmp_ult_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == true
|
|
; run: %icmp_ult_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == true
|
|
; run: %icmp_ult_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == false
|
|
|
|
function %icmp_sle_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 sle v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_sle_i128(0, 0, 0, 0) == true
|
|
; run: %icmp_sle_i128(1, 0, 1, 0) == true
|
|
; run: %icmp_sle_i128(0, 0, 1, 0) == true
|
|
; run: %icmp_sle_i128(-1, -1, 0, 0) == true
|
|
; run: %icmp_sle_i128(0, 0, -1, -1) == false
|
|
; run: %icmp_sle_i128(-1, -1, -1, -1) == true
|
|
; run: %icmp_sle_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == true
|
|
; run: %icmp_sle_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == true
|
|
; run: %icmp_sle_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == false
|
|
|
|
function %icmp_ule_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 ule v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_ule_i128(0, 0, 0, 0) == true
|
|
; run: %icmp_ule_i128(1, 0, 1, 0) == true
|
|
; run: %icmp_ule_i128(0, 0, 1, 0) == true
|
|
; run: %icmp_ule_i128(-1, -1, 0, 0) == false
|
|
; run: %icmp_ule_i128(0, 0, -1, -1) == true
|
|
; run: %icmp_ule_i128(-1, -1, -1, -1) == true
|
|
; run: %icmp_ule_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == true
|
|
; run: %icmp_ule_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == true
|
|
; run: %icmp_ule_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == false
|
|
|
|
function %icmp_sgt_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 sgt v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_sgt_i128(0, 0, 0, 0) == false
|
|
; run: %icmp_sgt_i128(1, 0, 1, 0) == false
|
|
; run: %icmp_sgt_i128(0, 0, 1, 0) == false
|
|
; run: %icmp_sgt_i128(-1, -1, 0, 0) == false
|
|
; run: %icmp_sgt_i128(0, 0, -1, -1) == true
|
|
; run: %icmp_sgt_i128(-1, -1, -1, -1) == false
|
|
; run: %icmp_sgt_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == false
|
|
; run: %icmp_sgt_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == false
|
|
; run: %icmp_sgt_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == true
|
|
|
|
function %icmp_ugt_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 ugt v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_ugt_i128(0, 0, 0, 0) == false
|
|
; run: %icmp_ugt_i128(1, 0, 1, 0) == false
|
|
; run: %icmp_ugt_i128(0, 0, 1, 0) == false
|
|
; run: %icmp_ugt_i128(-1, -1, 0, 0) == true
|
|
; run: %icmp_ugt_i128(0, 0, -1, -1) == false
|
|
; run: %icmp_ugt_i128(-1, -1, -1, -1) == false
|
|
; run: %icmp_ugt_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == false
|
|
; run: %icmp_ugt_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == false
|
|
; run: %icmp_ugt_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == true
|
|
|
|
function %icmp_sge_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 sge v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_sge_i128(0, 0, 0, 0) == true
|
|
; run: %icmp_sge_i128(1, 0, 1, 0) == true
|
|
; run: %icmp_sge_i128(0, 0, 1, 0) == false
|
|
; run: %icmp_sge_i128(-1, -1, 0, 0) == false
|
|
; run: %icmp_sge_i128(0, 0, -1, -1) == true
|
|
; run: %icmp_sge_i128(-1, -1, -1, -1) == true
|
|
; run: %icmp_sge_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == false
|
|
; run: %icmp_sge_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == false
|
|
; run: %icmp_sge_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == true
|
|
|
|
function %icmp_uge_i128(i64, i64, i64, i64) -> b1 {
|
|
block0(v0: i64,v1: i64,v2: i64,v3: i64):
|
|
v4 = iconcat v0, v1
|
|
v5 = iconcat v2, v3
|
|
|
|
v6 = icmp.i128 uge v4, v5
|
|
return v6
|
|
}
|
|
; run: %icmp_uge_i128(0, 0, 0, 0) == true
|
|
; run: %icmp_uge_i128(1, 0, 1, 0) == true
|
|
; run: %icmp_uge_i128(0, 0, 1, 0) == false
|
|
; run: %icmp_uge_i128(-1, -1, 0, 0) == true
|
|
; run: %icmp_uge_i128(0, 0, -1, -1) == false
|
|
; run: %icmp_uge_i128(-1, -1, -1, -1) == true
|
|
; run: %icmp_uge_i128(0xFFFFFFFF_FFFFFFFD, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF, 0xFFFFFFFF_FFFFFFFF) == false
|
|
; run: %icmp_uge_i128(0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE, 0x00000000_00000000, 0xDECAFFFF_DECAFFFF) == false
|
|
; run: %icmp_uge_i128(0x00000000_00000000, 0xDECAFFFF_DECAFFFF, 0x00000000_00000000, 0xC0FFEEEE_C0FFEEEE) == true
|
|
|
|
|
|
; Icmp Imm Tests
|
|
function %test_icmp_imm_eq_i128() -> b1 {
|
|
block0:
|
|
v11 = iconst.i64 0x0
|
|
v12 = iconst.i64 0x0
|
|
v1 = iconcat v11, v12
|
|
v10 = icmp_imm.i128 eq v1, 0x0
|
|
return v10
|
|
}
|
|
|
|
; run
|
|
|
|
function %test_icmp_imm_ne_i128() -> b1 {
|
|
block0:
|
|
v11 = iconst.i64 0x0
|
|
v12 = iconst.i64 0x0
|
|
v1 = iconcat v11, v12
|
|
v10 = icmp_imm.i128 ne v1, 0x1
|
|
return v10
|
|
}
|
|
|
|
; run
|