1326f7aedSWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \ 3326f7aedSWANG Xuerui; RUN: | FileCheck %s --check-prefix=LA32 4*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \ 5326f7aedSWANG Xuerui; RUN: | FileCheck %s --check-prefix=LA64 6326f7aedSWANG Xuerui 7326f7aedSWANG Xueruideclare i7 @llvm.bitreverse.i7(i7) 8326f7aedSWANG Xueruideclare i8 @llvm.bitreverse.i8(i8) 9326f7aedSWANG Xueruideclare i16 @llvm.bitreverse.i16(i16) 10326f7aedSWANG Xueruideclare i24 @llvm.bitreverse.i24(i24) 11326f7aedSWANG Xueruideclare i32 @llvm.bitreverse.i32(i32) 12326f7aedSWANG Xueruideclare i48 @llvm.bitreverse.i48(i48) 13326f7aedSWANG Xueruideclare i64 @llvm.bitreverse.i64(i64) 14326f7aedSWANG Xueruideclare i77 @llvm.bitreverse.i77(i77) 15326f7aedSWANG Xueruideclare i128 @llvm.bitreverse.i128(i128) 16326f7aedSWANG Xuerui 17326f7aedSWANG Xueruidefine i8 @test_bitreverse_i8(i8 %a) nounwind { 18326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i8: 19326f7aedSWANG Xuerui; LA32: # %bb.0: 20326f7aedSWANG Xuerui; LA32-NEXT: bitrev.4b $a0, $a0 21ed078c48SWANG Xuerui; LA32-NEXT: ret 22326f7aedSWANG Xuerui; 23326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i8: 24326f7aedSWANG Xuerui; LA64: # %bb.0: 25326f7aedSWANG Xuerui; LA64-NEXT: bitrev.4b $a0, $a0 26ed078c48SWANG Xuerui; LA64-NEXT: ret 27326f7aedSWANG Xuerui %tmp = call i8 @llvm.bitreverse.i8(i8 %a) 28326f7aedSWANG Xuerui ret i8 %tmp 29326f7aedSWANG Xuerui} 30326f7aedSWANG Xuerui 31326f7aedSWANG Xueruidefine i16 @test_bitreverse_i16(i16 %a) nounwind { 32326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i16: 33326f7aedSWANG Xuerui; LA32: # %bb.0: 34326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a0, $a0 35326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a0, $a0, 16 36ed078c48SWANG Xuerui; LA32-NEXT: ret 37326f7aedSWANG Xuerui; 38326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i16: 39326f7aedSWANG Xuerui; LA64: # %bb.0: 40326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a0, $a0 41326f7aedSWANG Xuerui; LA64-NEXT: srli.d $a0, $a0, 48 42ed078c48SWANG Xuerui; LA64-NEXT: ret 43326f7aedSWANG Xuerui %tmp = call i16 @llvm.bitreverse.i16(i16 %a) 44326f7aedSWANG Xuerui ret i16 %tmp 45326f7aedSWANG Xuerui} 46326f7aedSWANG Xuerui 47326f7aedSWANG Xueruidefine i32 @test_bitreverse_i32(i32 %a) nounwind { 48326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i32: 49326f7aedSWANG Xuerui; LA32: # %bb.0: 50326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a0, $a0 51ed078c48SWANG Xuerui; LA32-NEXT: ret 52326f7aedSWANG Xuerui; 53326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i32: 54326f7aedSWANG Xuerui; LA64: # %bb.0: 55326f7aedSWANG Xuerui; LA64-NEXT: bitrev.w $a0, $a0 56ed078c48SWANG Xuerui; LA64-NEXT: ret 57326f7aedSWANG Xuerui %tmp = call i32 @llvm.bitreverse.i32(i32 %a) 58326f7aedSWANG Xuerui ret i32 %tmp 59326f7aedSWANG Xuerui} 60326f7aedSWANG Xuerui 61326f7aedSWANG Xueruidefine i64 @test_bitreverse_i64(i64 %a) nounwind { 62326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i64: 63326f7aedSWANG Xuerui; LA32: # %bb.0: 64326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a2, $a1 65326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a1, $a0 66326f7aedSWANG Xuerui; LA32-NEXT: move $a0, $a2 67ed078c48SWANG Xuerui; LA32-NEXT: ret 68326f7aedSWANG Xuerui; 69326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i64: 70326f7aedSWANG Xuerui; LA64: # %bb.0: 71326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a0, $a0 72ed078c48SWANG Xuerui; LA64-NEXT: ret 73326f7aedSWANG Xuerui %tmp = call i64 @llvm.bitreverse.i64(i64 %a) 74326f7aedSWANG Xuerui ret i64 %tmp 75326f7aedSWANG Xuerui} 76326f7aedSWANG Xuerui 77326f7aedSWANG Xuerui;; Bitreverse on non-native integer widths. 78326f7aedSWANG Xuerui 79326f7aedSWANG Xueruidefine i7 @test_bitreverse_i7(i7 %a) nounwind { 80326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i7: 81326f7aedSWANG Xuerui; LA32: # %bb.0: 82326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a0, $a0 83326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a0, $a0, 25 84ed078c48SWANG Xuerui; LA32-NEXT: ret 85326f7aedSWANG Xuerui; 86326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i7: 87326f7aedSWANG Xuerui; LA64: # %bb.0: 88326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a0, $a0 89326f7aedSWANG Xuerui; LA64-NEXT: srli.d $a0, $a0, 57 90ed078c48SWANG Xuerui; LA64-NEXT: ret 91326f7aedSWANG Xuerui %tmp = call i7 @llvm.bitreverse.i7(i7 %a) 92326f7aedSWANG Xuerui ret i7 %tmp 93326f7aedSWANG Xuerui} 94326f7aedSWANG Xuerui 95326f7aedSWANG Xueruidefine i24 @test_bitreverse_i24(i24 %a) nounwind { 96326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i24: 97326f7aedSWANG Xuerui; LA32: # %bb.0: 98326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a0, $a0 99326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a0, $a0, 8 100ed078c48SWANG Xuerui; LA32-NEXT: ret 101326f7aedSWANG Xuerui; 102326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i24: 103326f7aedSWANG Xuerui; LA64: # %bb.0: 104326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a0, $a0 105326f7aedSWANG Xuerui; LA64-NEXT: srli.d $a0, $a0, 40 106ed078c48SWANG Xuerui; LA64-NEXT: ret 107326f7aedSWANG Xuerui %tmp = call i24 @llvm.bitreverse.i24(i24 %a) 108326f7aedSWANG Xuerui ret i24 %tmp 109326f7aedSWANG Xuerui} 110326f7aedSWANG Xuerui 111326f7aedSWANG Xueruidefine i48 @test_bitreverse_i48(i48 %a) nounwind { 112326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i48: 113326f7aedSWANG Xuerui; LA32: # %bb.0: 114326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a2, $a0 11519e2ebbfSWANG Xuerui; LA32-NEXT: bitrev.w $a0, $a1 11619e2ebbfSWANG Xuerui; LA32-NEXT: bytepick.w $a0, $a0, $a2, 2 117326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a1, $a2, 16 118ed078c48SWANG Xuerui; LA32-NEXT: ret 119326f7aedSWANG Xuerui; 120326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i48: 121326f7aedSWANG Xuerui; LA64: # %bb.0: 122326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a0, $a0 123326f7aedSWANG Xuerui; LA64-NEXT: srli.d $a0, $a0, 16 124ed078c48SWANG Xuerui; LA64-NEXT: ret 125326f7aedSWANG Xuerui %tmp = call i48 @llvm.bitreverse.i48(i48 %a) 126326f7aedSWANG Xuerui ret i48 %tmp 127326f7aedSWANG Xuerui} 128326f7aedSWANG Xuerui 129326f7aedSWANG Xueruidefine i77 @test_bitreverse_i77(i77 %a) nounwind { 130326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i77: 131326f7aedSWANG Xuerui; LA32: # %bb.0: 132a5c90e48Swanglei; LA32-NEXT: ld.w $a2, $a1, 4 133a5c90e48Swanglei; LA32-NEXT: ld.w $a3, $a1, 8 134a5c90e48Swanglei; LA32-NEXT: ld.w $a1, $a1, 0 135326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a2, $a2 136a5c90e48Swanglei; LA32-NEXT: slli.w $a4, $a2, 13 137326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a3, $a3 138a5c90e48Swanglei; LA32-NEXT: srli.w $a3, $a3, 19 139a5c90e48Swanglei; LA32-NEXT: or $a3, $a3, $a4 140326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a2, $a2, 19 141326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a1, $a1 142a5c90e48Swanglei; LA32-NEXT: slli.w $a4, $a1, 13 143a5c90e48Swanglei; LA32-NEXT: or $a2, $a4, $a2 144326f7aedSWANG Xuerui; LA32-NEXT: srli.w $a1, $a1, 19 145a5c90e48Swanglei; LA32-NEXT: st.h $a1, $a0, 8 146a5c90e48Swanglei; LA32-NEXT: st.w $a2, $a0, 4 147a5c90e48Swanglei; LA32-NEXT: st.w $a3, $a0, 0 148ed078c48SWANG Xuerui; LA32-NEXT: ret 149326f7aedSWANG Xuerui; 150326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i77: 151326f7aedSWANG Xuerui; LA64: # %bb.0: 152326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a2, $a0 153326f7aedSWANG Xuerui; LA64-NEXT: slli.d $a0, $a2, 13 154a5c90e48Swanglei; LA64-NEXT: bitrev.d $a1, $a1 155a5c90e48Swanglei; LA64-NEXT: srli.d $a1, $a1, 51 156326f7aedSWANG Xuerui; LA64-NEXT: or $a0, $a1, $a0 157326f7aedSWANG Xuerui; LA64-NEXT: srli.d $a1, $a2, 51 158ed078c48SWANG Xuerui; LA64-NEXT: ret 159326f7aedSWANG Xuerui %tmp = call i77 @llvm.bitreverse.i77(i77 %a) 160326f7aedSWANG Xuerui ret i77 %tmp 161326f7aedSWANG Xuerui} 162326f7aedSWANG Xuerui 163326f7aedSWANG Xueruidefine i128 @test_bitreverse_i128(i128 %a) nounwind { 164326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i128: 165326f7aedSWANG Xuerui; LA32: # %bb.0: 166a5c90e48Swanglei; LA32-NEXT: ld.w $a2, $a1, 12 167a5c90e48Swanglei; LA32-NEXT: ld.w $a3, $a1, 8 168a5c90e48Swanglei; LA32-NEXT: ld.w $a4, $a1, 4 169a5c90e48Swanglei; LA32-NEXT: ld.w $a1, $a1, 0 170326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a2, $a2 171a5c90e48Swanglei; LA32-NEXT: bitrev.w $a3, $a3 172a5c90e48Swanglei; LA32-NEXT: bitrev.w $a4, $a4 173326f7aedSWANG Xuerui; LA32-NEXT: bitrev.w $a1, $a1 174a5c90e48Swanglei; LA32-NEXT: st.w $a1, $a0, 12 175a5c90e48Swanglei; LA32-NEXT: st.w $a4, $a0, 8 176a5c90e48Swanglei; LA32-NEXT: st.w $a3, $a0, 4 177a5c90e48Swanglei; LA32-NEXT: st.w $a2, $a0, 0 178ed078c48SWANG Xuerui; LA32-NEXT: ret 179326f7aedSWANG Xuerui; 180326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i128: 181326f7aedSWANG Xuerui; LA64: # %bb.0: 182326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a2, $a1 183326f7aedSWANG Xuerui; LA64-NEXT: bitrev.d $a1, $a0 184326f7aedSWANG Xuerui; LA64-NEXT: move $a0, $a2 185ed078c48SWANG Xuerui; LA64-NEXT: ret 186326f7aedSWANG Xuerui %tmp = call i128 @llvm.bitreverse.i128(i128 %a) 187326f7aedSWANG Xuerui ret i128 %tmp 188326f7aedSWANG Xuerui} 189