Files
wasmtime/cranelift/filetests/filetests/isa/aarch64/condbr.clif
Afonso Bordado e9727b9d4b aarch64: Fix i128 of/nof implementations (#4403)
@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.
2022-07-07 11:00:58 -07:00

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