@yuyang-ok reported via zulip that i128 overflow tests were: 1. different from the interpreter implementation 2. wrong on some of the test cases This fixes both the tests and the aarch64 implementation and adds the interpreter to the testsuite.
555 lines
8.0 KiB
Plaintext
555 lines
8.0 KiB
Plaintext
test compile precise-output
|
|
set unwind_info=false
|
|
target aarch64
|
|
|
|
function %f(i64, i64) -> b1 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = icmp eq v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x1
|
|
; cset x0, eq
|
|
; ret
|
|
|
|
function %icmp_eq_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp eq v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; eor x10, x0, x2
|
|
; eor x12, x1, x3
|
|
; adds xzr, x10, x12
|
|
; cset x0, eq
|
|
; ret
|
|
|
|
function %icmp_ne_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp ne v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; eor x10, x0, x2
|
|
; eor x12, x1, x3
|
|
; adds xzr, x10, x12
|
|
; cset x0, ne
|
|
; ret
|
|
|
|
function %icmp_slt_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp slt v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, lo
|
|
; subs xzr, x1, x3
|
|
; cset x14, lt
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_ult_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp ult v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, lo
|
|
; subs xzr, x1, x3
|
|
; cset x14, lo
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_sle_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp sle v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, ls
|
|
; subs xzr, x1, x3
|
|
; cset x14, le
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_ule_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp ule v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, ls
|
|
; subs xzr, x1, x3
|
|
; cset x14, ls
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_sgt_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp sgt v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, hi
|
|
; subs xzr, x1, x3
|
|
; cset x14, gt
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_ugt_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp ugt v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, hi
|
|
; subs xzr, x1, x3
|
|
; cset x14, hi
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_sge_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp sge v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, hs
|
|
; subs xzr, x1, x3
|
|
; cset x14, ge
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_uge_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp uge v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x11, hs
|
|
; subs xzr, x1, x3
|
|
; cset x14, hs
|
|
; csel x0, x11, x14, eq
|
|
; ret
|
|
|
|
function %icmp_of_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp of v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; sbcs x11, x1, x3
|
|
; eor x13, x1, x3
|
|
; eor x11, x1, x11
|
|
; ands xzr, x13, x11
|
|
; cset x0, lt
|
|
; ret
|
|
|
|
function %icmp_nof_i128(i128, i128) -> b1 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = icmp nof v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; sbcs x11, x1, x3
|
|
; eor x13, x1, x3
|
|
; eor x11, x1, x11
|
|
; ands xzr, x13, x11
|
|
; cset x0, ge
|
|
; ret
|
|
|
|
function %f(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = ifcmp v0, v1
|
|
brif eq v2, block1
|
|
jump block2
|
|
|
|
block1:
|
|
v4 = iconst.i64 1
|
|
return v4
|
|
|
|
block2:
|
|
v5 = iconst.i64 2
|
|
return v5
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x1
|
|
; b.eq label1 ; b label2
|
|
; block1:
|
|
; movz x0, #1
|
|
; ret
|
|
; block2:
|
|
; movz x0, #2
|
|
; ret
|
|
|
|
function %f(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = ifcmp v0, v1
|
|
brif eq v2, block1
|
|
jump block1
|
|
|
|
block1:
|
|
v4 = iconst.i64 1
|
|
return v4
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x1
|
|
; b.eq label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; movz x0, #1
|
|
; ret
|
|
|
|
function %i128_brz(i128){
|
|
block0(v0: i128):
|
|
brz v0, block1
|
|
jump block1
|
|
|
|
block1:
|
|
nop
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; orr x4, x0, x1
|
|
; cbz x4, label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_brnz(i128){
|
|
block0(v0: i128):
|
|
brnz v0, block1
|
|
jump block1
|
|
|
|
block1:
|
|
nop
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; orr x4, x0, x1
|
|
; cbnz x4, label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_eq(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp eq v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; eor x8, x0, x2
|
|
; eor x10, x1, x3
|
|
; adds xzr, x8, x10
|
|
; b.eq label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_ne(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp ne v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; eor x8, x0, x2
|
|
; eor x10, x1, x3
|
|
; adds xzr, x8, x10
|
|
; b.ne label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_slt(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp slt v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, lo
|
|
; subs xzr, x1, x3
|
|
; cset x12, lt
|
|
; csel x9, x9, x12, eq
|
|
; subs xzr, xzr, x9
|
|
; b.lt label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_ult(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp ult v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, lo
|
|
; subs xzr, x1, x3
|
|
; cset x12, lo
|
|
; csel x9, x9, x12, eq
|
|
; subs xzr, xzr, x9
|
|
; b.lo label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_sle(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp sle v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, ls
|
|
; subs xzr, x1, x3
|
|
; cset x12, le
|
|
; csel x9, x9, x12, eq
|
|
; movz x12, #1
|
|
; subs xzr, x12, x9
|
|
; b.le label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_ule(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp ule v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, ls
|
|
; subs xzr, x1, x3
|
|
; cset x12, ls
|
|
; csel x9, x9, x12, eq
|
|
; movz x12, #1
|
|
; subs xzr, x12, x9
|
|
; b.ls label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_sgt(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp sgt v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, hi
|
|
; subs xzr, x1, x3
|
|
; cset x12, gt
|
|
; csel x9, x9, x12, eq
|
|
; subs xzr, x9, xzr
|
|
; b.gt label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_ugt(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp ugt v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, hi
|
|
; subs xzr, x1, x3
|
|
; cset x12, hi
|
|
; csel x9, x9, x12, eq
|
|
; subs xzr, x9, xzr
|
|
; b.hi label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_sge(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp sge v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, hs
|
|
; subs xzr, x1, x3
|
|
; cset x12, ge
|
|
; csel x9, x9, x12, eq
|
|
; movz x12, #1
|
|
; subs xzr, x9, x12
|
|
; b.ge label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_uge(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp uge v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; cset x9, hs
|
|
; subs xzr, x1, x3
|
|
; cset x12, hs
|
|
; csel x9, x9, x12, eq
|
|
; movz x12, #1
|
|
; subs xzr, x9, x12
|
|
; b.hs label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_of(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp of v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; sbcs x9, x1, x3
|
|
; eor x11, x1, x3
|
|
; eor x9, x1, x9
|
|
; ands xzr, x11, x9
|
|
; b.lt label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|
|
function %i128_bricmp_nof(i128, i128) {
|
|
block0(v0: i128, v1: i128):
|
|
br_icmp nof v0, v1, block1
|
|
jump block1
|
|
|
|
block1:
|
|
return
|
|
}
|
|
|
|
; block0:
|
|
; subs xzr, x0, x2
|
|
; sbcs x9, x1, x3
|
|
; eor x11, x1, x3
|
|
; eor x9, x1, x9
|
|
; ands xzr, x11, x9
|
|
; b.ge label1 ; b label2
|
|
; block1:
|
|
; b label3
|
|
; block2:
|
|
; b label3
|
|
; block3:
|
|
; ret
|
|
|