[RISCV] Add more rev32 and rev16 test cases using fshl/fshr intrinsics. NFC
fshl/fshr intrinsics turn into rotl/rotr ISD opcodes and we don't have a complete set of patterns. We pattern match rotl, but we have a custom match for rori that gets priority. We don't pattern match rotr and we don't have patterns or custom code for rori from rotr.
This commit is contained in:
parent
05c4ae122e
commit
5547d69e54
|
|
@ -659,6 +659,53 @@ define i32 @grev16_i32(i32 %a) nounwind {
|
|||
ret i32 %or
|
||||
}
|
||||
|
||||
declare i32 @llvm.fshl.i32(i32, i32, i32)
|
||||
declare i32 @llvm.fshr.i32(i32, i32, i32)
|
||||
|
||||
define signext i32 @grev16_i32_fshl(i32 signext %a) nounwind {
|
||||
; RV32I-LABEL: grev16_i32_fshl:
|
||||
; RV32I: # %bb.0:
|
||||
; RV32I-NEXT: srli a1, a0, 16
|
||||
; RV32I-NEXT: slli a0, a0, 16
|
||||
; RV32I-NEXT: or a0, a0, a1
|
||||
; RV32I-NEXT: ret
|
||||
;
|
||||
; RV32IB-LABEL: grev16_i32_fshl:
|
||||
; RV32IB: # %bb.0:
|
||||
; RV32IB-NEXT: rori a0, a0, 16
|
||||
; RV32IB-NEXT: ret
|
||||
;
|
||||
; RV32IBP-LABEL: grev16_i32_fshl:
|
||||
; RV32IBP: # %bb.0:
|
||||
; RV32IBP-NEXT: rori a0, a0, 16
|
||||
; RV32IBP-NEXT: ret
|
||||
%or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 16)
|
||||
ret i32 %or
|
||||
}
|
||||
|
||||
define signext i32 @grev16_i32_fshr(i32 signext %a) nounwind {
|
||||
; RV32I-LABEL: grev16_i32_fshr:
|
||||
; RV32I: # %bb.0:
|
||||
; RV32I-NEXT: slli a1, a0, 16
|
||||
; RV32I-NEXT: srli a0, a0, 16
|
||||
; RV32I-NEXT: or a0, a0, a1
|
||||
; RV32I-NEXT: ret
|
||||
;
|
||||
; RV32IB-LABEL: grev16_i32_fshr:
|
||||
; RV32IB: # %bb.0:
|
||||
; RV32IB-NEXT: addi a1, zero, 16
|
||||
; RV32IB-NEXT: ror a0, a0, a1
|
||||
; RV32IB-NEXT: ret
|
||||
;
|
||||
; RV32IBP-LABEL: grev16_i32_fshr:
|
||||
; RV32IBP: # %bb.0:
|
||||
; RV32IBP-NEXT: addi a1, zero, 16
|
||||
; RV32IBP-NEXT: ror a0, a0, a1
|
||||
; RV32IBP-NEXT: ret
|
||||
%or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 16)
|
||||
ret i32 %or
|
||||
}
|
||||
|
||||
define i64 @grev16_i64(i64 %a) nounwind {
|
||||
; RV32I-LABEL: grev16_i64:
|
||||
; RV32I: # %bb.0:
|
||||
|
|
|
|||
|
|
@ -745,6 +745,53 @@ define signext i32 @grev16_i32(i32 signext %a) nounwind {
|
|||
ret i32 %or
|
||||
}
|
||||
|
||||
declare i32 @llvm.fshl.i32(i32, i32, i32)
|
||||
declare i32 @llvm.fshr.i32(i32, i32, i32)
|
||||
|
||||
define signext i32 @grev16_i32_fshl(i32 signext %a) nounwind {
|
||||
; RV64I-LABEL: grev16_i32_fshl:
|
||||
; RV64I: # %bb.0:
|
||||
; RV64I-NEXT: srliw a1, a0, 16
|
||||
; RV64I-NEXT: slli a0, a0, 16
|
||||
; RV64I-NEXT: or a0, a0, a1
|
||||
; RV64I-NEXT: sext.w a0, a0
|
||||
; RV64I-NEXT: ret
|
||||
;
|
||||
; RV64IB-LABEL: grev16_i32_fshl:
|
||||
; RV64IB: # %bb.0:
|
||||
; RV64IB-NEXT: greviw a0, a0, 16
|
||||
; RV64IB-NEXT: ret
|
||||
;
|
||||
; RV64IBP-LABEL: grev16_i32_fshl:
|
||||
; RV64IBP: # %bb.0:
|
||||
; RV64IBP-NEXT: greviw a0, a0, 16
|
||||
; RV64IBP-NEXT: ret
|
||||
%or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 16)
|
||||
ret i32 %or
|
||||
}
|
||||
|
||||
define signext i32 @grev16_i32_fshr(i32 signext %a) nounwind {
|
||||
; RV64I-LABEL: grev16_i32_fshr:
|
||||
; RV64I: # %bb.0:
|
||||
; RV64I-NEXT: slli a1, a0, 16
|
||||
; RV64I-NEXT: srliw a0, a0, 16
|
||||
; RV64I-NEXT: or a0, a0, a1
|
||||
; RV64I-NEXT: sext.w a0, a0
|
||||
; RV64I-NEXT: ret
|
||||
;
|
||||
; RV64IB-LABEL: grev16_i32_fshr:
|
||||
; RV64IB: # %bb.0:
|
||||
; RV64IB-NEXT: greviw a0, a0, 16
|
||||
; RV64IB-NEXT: ret
|
||||
;
|
||||
; RV64IBP-LABEL: grev16_i32_fshr:
|
||||
; RV64IBP: # %bb.0:
|
||||
; RV64IBP-NEXT: greviw a0, a0, 16
|
||||
; RV64IBP-NEXT: ret
|
||||
%or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 16)
|
||||
ret i32 %or
|
||||
}
|
||||
|
||||
define i64 @grev16_i64(i64 %a) nounwind {
|
||||
; RV64I-LABEL: grev16_i64:
|
||||
; RV64I: # %bb.0:
|
||||
|
|
@ -806,6 +853,53 @@ define i64 @grev32(i64 %a) nounwind {
|
|||
ret i64 %or
|
||||
}
|
||||
|
||||
declare i64 @llvm.fshl.i64(i64, i64, i64)
|
||||
declare i64 @llvm.fshr.i64(i64, i64, i64)
|
||||
|
||||
define i64 @grev32_fshl(i64 %a) nounwind {
|
||||
; RV64I-LABEL: grev32_fshl:
|
||||
; RV64I: # %bb.0:
|
||||
; RV64I-NEXT: srli a1, a0, 32
|
||||
; RV64I-NEXT: slli a0, a0, 32
|
||||
; RV64I-NEXT: or a0, a0, a1
|
||||
; RV64I-NEXT: ret
|
||||
;
|
||||
; RV64IB-LABEL: grev32_fshl:
|
||||
; RV64IB: # %bb.0:
|
||||
; RV64IB-NEXT: rori a0, a0, 32
|
||||
; RV64IB-NEXT: ret
|
||||
;
|
||||
; RV64IBP-LABEL: grev32_fshl:
|
||||
; RV64IBP: # %bb.0:
|
||||
; RV64IBP-NEXT: rori a0, a0, 32
|
||||
; RV64IBP-NEXT: ret
|
||||
%or = tail call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 32)
|
||||
ret i64 %or
|
||||
}
|
||||
|
||||
define i64 @grev32_fshr(i64 %a) nounwind {
|
||||
; RV64I-LABEL: grev32_fshr:
|
||||
; RV64I: # %bb.0:
|
||||
; RV64I-NEXT: slli a1, a0, 32
|
||||
; RV64I-NEXT: srli a0, a0, 32
|
||||
; RV64I-NEXT: or a0, a0, a1
|
||||
; RV64I-NEXT: ret
|
||||
;
|
||||
; RV64IB-LABEL: grev32_fshr:
|
||||
; RV64IB: # %bb.0:
|
||||
; RV64IB-NEXT: addi a1, zero, 32
|
||||
; RV64IB-NEXT: ror a0, a0, a1
|
||||
; RV64IB-NEXT: ret
|
||||
;
|
||||
; RV64IBP-LABEL: grev32_fshr:
|
||||
; RV64IBP: # %bb.0:
|
||||
; RV64IBP-NEXT: addi a1, zero, 32
|
||||
; RV64IBP-NEXT: ror a0, a0, a1
|
||||
; RV64IBP-NEXT: ret
|
||||
%or = tail call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 32)
|
||||
ret i64 %or
|
||||
}
|
||||
|
||||
declare i32 @llvm.bswap.i32(i32)
|
||||
|
||||
define signext i32 @bswap_i32(i32 signext %a) nounwind {
|
||||
|
|
|
|||
Loading…
Reference in New Issue