* Add (bnot (bxor x y)) lowerings for s390x/aarch64 I originally thought that s390x's original lowering in #5709, but as was rightfully pointed out `(bnot (bxor x y))` is equivalent to `(bxor x (bnot y))` so the special lowering for one should apply as a special lowering for the other. For the s390x and aarch64 backend that have already have a fused lowering of the bxor/bnot add a lowering additionally for the bnot/bxor combination. * Add bnot(bxor(..)) tests for s390x 128-bit sizes
672 lines
10 KiB
Plaintext
672 lines
10 KiB
Plaintext
|
|
test compile precise-output
|
|
target s390x
|
|
|
|
; FIXME: add immediate operand versions
|
|
|
|
function %band_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = band.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vn %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %band_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = band.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; ngr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_i64_mem(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = load.i64 v1
|
|
v3 = band.i64 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; ng %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %band_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = band.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_i32_mem(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1
|
|
v3 = band.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; n %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %band_i32_memoff(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1+4096
|
|
v3 = band.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; ny %r2, 4096(%r3)
|
|
; br %r14
|
|
|
|
function %band_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = band.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_i16_mem(i16, i64) -> i16 {
|
|
block0(v0: i16, v1: i64):
|
|
v2 = load.i16 v1
|
|
v3 = band.i16 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llh %r3, 0(%r3)
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = band.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_i8_mem(i8, i64) -> i8 {
|
|
block0(v0: i8, v1: i64):
|
|
v2 = load.i8 v1
|
|
v3 = band.i8 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llc %r3, 0(%r3)
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = bor.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vo %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bor_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = bor.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; ogr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i64_mem(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = load.i64 v1
|
|
v3 = bor.i64 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; og %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %bor_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = bor.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i32_mem(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1
|
|
v3 = bor.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; o %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %bor_i32_memoff(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1+4096
|
|
v3 = bor.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; oy %r2, 4096(%r3)
|
|
; br %r14
|
|
|
|
function %bor_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = bor.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i16_mem(i16, i64) -> i16 {
|
|
block0(v0: i16, v1: i64):
|
|
v2 = load.i16 v1
|
|
v3 = bor.i16 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llh %r3, 0(%r3)
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = bor.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_i8_mem(i8, i64) -> i8 {
|
|
block0(v0: i8, v1: i64):
|
|
v2 = load.i8 v1
|
|
v3 = bor.i8 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llc %r3, 0(%r3)
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = bxor.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vx %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bxor_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = bxor.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xgr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i64_mem(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = load.i64 v1
|
|
v3 = bxor.i64 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; xg %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %bxor_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = bxor.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i32_mem(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1
|
|
v3 = bxor.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; x %r2, 0(%r3)
|
|
; br %r14
|
|
|
|
function %bxor_i32_memoff(i32, i64) -> i32 {
|
|
block0(v0: i32, v1: i64):
|
|
v2 = load.i32 v1+4096
|
|
v3 = bxor.i32 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; xy %r2, 4096(%r3)
|
|
; br %r14
|
|
|
|
function %bxor_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = bxor.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i16_mem(i16, i64) -> i16 {
|
|
block0(v0: i16, v1: i64):
|
|
v2 = load.i16 v1
|
|
v3 = bxor.i16 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llh %r3, 0(%r3)
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = bxor.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_i8_mem(i8, i64) -> i8 {
|
|
block0(v0: i8, v1: i64):
|
|
v2 = load.i8 v1
|
|
v3 = bxor.i8 v0, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; llc %r3, 0(%r3)
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_not_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = band_not.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vnc %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %band_not_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = band_not.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xihf %r3, 4294967295
|
|
; ngr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_not_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = band_not.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_not_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = band_not.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %band_not_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = band_not.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; nr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_not_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = bor_not.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; voc %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bor_not_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = bor_not.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xihf %r3, 4294967295
|
|
; ogr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_not_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = bor_not.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_not_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = bor_not.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bor_not_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = bor_not.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_not_i128(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = bxor_not.i128 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vnx %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bxor_not_i64(i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64):
|
|
v2 = bxor_not.i64 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xihf %r3, 4294967295
|
|
; xgr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_not_i32(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = bxor_not.i32 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_not_i16(i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16):
|
|
v2 = bxor_not.i16 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bxor_not_i8(i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8):
|
|
v2 = bxor_not.i8 v0, v1
|
|
return v2
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r3, 4294967295
|
|
; xr %r2, %r3
|
|
; br %r14
|
|
|
|
function %bnot_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = bnot.i128 v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vno %v4, %v1, %v1
|
|
; vst %v4, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bnot_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = bnot.i64 v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r2, 4294967295
|
|
; xihf %r2, 4294967295
|
|
; br %r14
|
|
|
|
function %bnot_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = bnot.i32 v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r2, 4294967295
|
|
; br %r14
|
|
|
|
function %bnot_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = bnot.i16 v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r2, 4294967295
|
|
; br %r14
|
|
|
|
function %bnot_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = bnot.i8 v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; xilf %r2, 4294967295
|
|
; br %r14
|
|
|
|
function %bitselect_i128(i128, i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128, v2: i128):
|
|
v3 = bitselect.i128 v0, v1, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vl %v5, 0(%r5)
|
|
; vsel %v16, %v3, %v5, %v1
|
|
; vst %v16, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bitselect_i64(i64, i64, i64) -> i64 {
|
|
block0(v0: i64, v1: i64, v2: i64):
|
|
v3 = bitselect.i64 v0, v1, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; ngr %r3, %r2
|
|
; lgr %r5, %r2
|
|
; xilf %r5, 4294967295
|
|
; xihf %r5, 4294967295
|
|
; ngr %r4, %r5
|
|
; ogrk %r2, %r4, %r3
|
|
; br %r14
|
|
|
|
function %bitselect_i32(i32, i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32, v2: i32):
|
|
v3 = bitselect.i32 v0, v1, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; nr %r3, %r2
|
|
; lgr %r5, %r2
|
|
; xilf %r5, 4294967295
|
|
; nrk %r2, %r4, %r5
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bitselect_i16(i16, i16, i16) -> i16 {
|
|
block0(v0: i16, v1: i16, v2: i16):
|
|
v3 = bitselect.i16 v0, v1, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; nr %r3, %r2
|
|
; lgr %r5, %r2
|
|
; xilf %r5, 4294967295
|
|
; nrk %r2, %r4, %r5
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bitselect_i8(i8, i8, i8) -> i8 {
|
|
block0(v0: i8, v1: i8, v2: i8):
|
|
v3 = bitselect.i8 v0, v1, v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; nr %r3, %r2
|
|
; lgr %r5, %r2
|
|
; xilf %r5, 4294967295
|
|
; nrk %r2, %r4, %r5
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %bnot_of_bxor(i32, i32) -> i32 {
|
|
block0(v0: i32, v1: i32):
|
|
v2 = bxor v0, v1
|
|
v3 = bnot v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; xr %r2, %r3
|
|
; xilf %r2, 4294967295
|
|
; br %r14
|
|
|
|
function %bnot_of_bxor(i128, i128) -> i128 {
|
|
block0(v0: i128, v1: i128):
|
|
v2 = bxor v0, v1
|
|
v3 = bnot v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; vl %v1, 0(%r3)
|
|
; vl %v3, 0(%r4)
|
|
; vnx %v6, %v1, %v3
|
|
; vst %v6, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bnot_of_bxor(i32x4, i32x4) -> i32x4 {
|
|
block0(v0: i32x4, v1: i32x4):
|
|
v2 = bxor v0, v1
|
|
v3 = bnot v2
|
|
return v3
|
|
}
|
|
|
|
; block0:
|
|
; vnx %v24, %v24, %v25
|
|
; br %r14
|
|
|