Since we're deconstructing an instruction anyway, go ahead and resolve any value aliases on its arguments before we construct the replacement instructions.
66 lines
1.8 KiB
Plaintext
66 lines
1.8 KiB
Plaintext
; Test the legalization of i64 arithmetic instructions.
|
|
test legalizer
|
|
isa riscv supports_m=1
|
|
|
|
; regex: V=v\d+
|
|
; regex: VX=vx\d+
|
|
|
|
function bitwise_and(i64, i64) -> i64 {
|
|
ebb0(v1: i64, v2: i64):
|
|
v3 = band v1, v2
|
|
return v3
|
|
}
|
|
; check: $(v1l=$V), $(v1h=$VX) = isplit_lohi $v1
|
|
; check: $(v2l=$V), $(v2h=$VX) = isplit_lohi $v2
|
|
; check: [R#ec
|
|
; sameln: $(v3l=$V) = band $v1l, $v2l
|
|
; check: [R#ec
|
|
; sameln: $(v3h=$V) = band $v1h, $v2h
|
|
; check: $v3 = iconcat_lohi $v3l, $v3h
|
|
|
|
function bitwise_or(i64, i64) -> i64 {
|
|
ebb0(v1: i64, v2: i64):
|
|
v3 = bor v1, v2
|
|
return v3
|
|
}
|
|
; check: $(v1l=$V), $(v1h=$VX) = isplit_lohi $v1
|
|
; check: $(v2l=$V), $(v2h=$VX) = isplit_lohi $v2
|
|
; check: [R#cc
|
|
; sameln: $(v3l=$V) = bor $v1l, $v2l
|
|
; check: [R#cc
|
|
; sameln: $(v3h=$V) = bor $v1h, $v2h
|
|
; check: $v3 = iconcat_lohi $v3l, $v3h
|
|
|
|
function bitwise_xor(i64, i64) -> i64 {
|
|
ebb0(v1: i64, v2: i64):
|
|
v3 = bxor v1, v2
|
|
return v3
|
|
}
|
|
; check: $(v1l=$V), $(v1h=$VX) = isplit_lohi $v1
|
|
; check: $(v2l=$V), $(v2h=$VX) = isplit_lohi $v2
|
|
; check: [R#8c
|
|
; sameln: $(v3l=$V) = bxor $v1l, $v2l
|
|
; check: [R#8c
|
|
; sameln: $(v3h=$V) = bxor $v1h, $v2h
|
|
; check: $v3 = iconcat_lohi $v3l, $v3h
|
|
|
|
function arith_add(i64, i64) -> i64 {
|
|
; Legalizing iadd.i64 requires two steps:
|
|
; 1. Narrow to iadd_cout.i32, then
|
|
; 2. Expand iadd_cout.i32 since RISC-V has no carry flag.
|
|
ebb0(v1: i64, v2: i64):
|
|
v3 = iadd v1, v2
|
|
return v3
|
|
}
|
|
; check: $(v1l=$V), $(v1h=$VX) = isplit_lohi $v1
|
|
; check: $(v2l=$V), $(v2h=$VX) = isplit_lohi $v2
|
|
; check: [R#0c
|
|
; sameln: $(v3l=$V) = iadd $v1l, $v2l
|
|
; check: $(c=$V) = icmp ult, $v3l, $v1l
|
|
; check: [R#0c
|
|
; sameln: $(v3h1=$V) = iadd $v1h, $v2h
|
|
; TODO: This doesn't typecheck. We need to convert the b1 result to i32.
|
|
; check: [R#0c
|
|
; sameln: $(v3h=$V) = iadd $v3h1, $c
|
|
; check: $v3 = iconcat_lohi $v3l, $v3h
|