1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefix=LA32 4; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefix=LA64 6 7declare i16 @llvm.bswap.i16(i16) 8declare i32 @llvm.bswap.i32(i32) 9declare i48 @llvm.bswap.i48(i48) 10declare i64 @llvm.bswap.i64(i64) 11declare i80 @llvm.bswap.i80(i80) 12declare i128 @llvm.bswap.i128(i128) 13 14define i16 @test_bswap_i16(i16 %a) nounwind { 15; LA32-LABEL: test_bswap_i16: 16; LA32: # %bb.0: 17; LA32-NEXT: revb.2h $a0, $a0 18; LA32-NEXT: ret 19; 20; LA64-LABEL: test_bswap_i16: 21; LA64: # %bb.0: 22; LA64-NEXT: revb.2h $a0, $a0 23; LA64-NEXT: ret 24 %tmp = call i16 @llvm.bswap.i16(i16 %a) 25 ret i16 %tmp 26} 27 28define i32 @test_bswap_i32(i32 %a) nounwind { 29; LA32-LABEL: test_bswap_i32: 30; LA32: # %bb.0: 31; LA32-NEXT: revb.2h $a0, $a0 32; LA32-NEXT: rotri.w $a0, $a0, 16 33; LA32-NEXT: ret 34; 35; LA64-LABEL: test_bswap_i32: 36; LA64: # %bb.0: 37; LA64-NEXT: revb.2w $a0, $a0 38; LA64-NEXT: ret 39 %tmp = call i32 @llvm.bswap.i32(i32 %a) 40 ret i32 %tmp 41} 42 43define i64 @test_bswap_i64(i64 %a) nounwind { 44; LA32-LABEL: test_bswap_i64: 45; LA32: # %bb.0: 46; LA32-NEXT: revb.2h $a1, $a1 47; LA32-NEXT: rotri.w $a2, $a1, 16 48; LA32-NEXT: revb.2h $a0, $a0 49; LA32-NEXT: rotri.w $a1, $a0, 16 50; LA32-NEXT: move $a0, $a2 51; LA32-NEXT: ret 52; 53; LA64-LABEL: test_bswap_i64: 54; LA64: # %bb.0: 55; LA64-NEXT: revb.d $a0, $a0 56; LA64-NEXT: ret 57 %tmp = call i64 @llvm.bswap.i64(i64 %a) 58 ret i64 %tmp 59} 60 61;; Bswap on non-native integer widths. 62 63define i48 @test_bswap_i48(i48 %a) nounwind { 64; LA32-LABEL: test_bswap_i48: 65; LA32: # %bb.0: 66; LA32-NEXT: revb.2h $a0, $a0 67; LA32-NEXT: rotri.w $a2, $a0, 16 68; LA32-NEXT: revb.2h $a0, $a1 69; LA32-NEXT: rotri.w $a0, $a0, 16 70; LA32-NEXT: bytepick.w $a0, $a0, $a2, 2 71; LA32-NEXT: srli.w $a1, $a2, 16 72; LA32-NEXT: ret 73; 74; LA64-LABEL: test_bswap_i48: 75; LA64: # %bb.0: 76; LA64-NEXT: revb.d $a0, $a0 77; LA64-NEXT: srli.d $a0, $a0, 16 78; LA64-NEXT: ret 79 %tmp = call i48 @llvm.bswap.i48(i48 %a) 80 ret i48 %tmp 81} 82 83define i80 @test_bswap_i80(i80 %a) nounwind { 84; LA32-LABEL: test_bswap_i80: 85; LA32: # %bb.0: 86; LA32-NEXT: ld.w $a2, $a1, 4 87; LA32-NEXT: ld.w $a3, $a1, 8 88; LA32-NEXT: ld.w $a1, $a1, 0 89; LA32-NEXT: revb.2h $a2, $a2 90; LA32-NEXT: rotri.w $a2, $a2, 16 91; LA32-NEXT: revb.2h $a3, $a3 92; LA32-NEXT: rotri.w $a3, $a3, 16 93; LA32-NEXT: bytepick.w $a3, $a3, $a2, 2 94; LA32-NEXT: revb.2h $a1, $a1 95; LA32-NEXT: rotri.w $a1, $a1, 16 96; LA32-NEXT: bytepick.w $a2, $a2, $a1, 2 97; LA32-NEXT: srli.w $a1, $a1, 16 98; LA32-NEXT: st.w $a2, $a0, 4 99; LA32-NEXT: st.w $a3, $a0, 0 100; LA32-NEXT: st.h $a1, $a0, 8 101; LA32-NEXT: ret 102; 103; LA64-LABEL: test_bswap_i80: 104; LA64: # %bb.0: 105; LA64-NEXT: revb.d $a2, $a0 106; LA64-NEXT: revb.d $a0, $a1 107; LA64-NEXT: bytepick.d $a0, $a0, $a2, 2 108; LA64-NEXT: srli.d $a1, $a2, 48 109; LA64-NEXT: ret 110 %tmp = call i80 @llvm.bswap.i80(i80 %a) 111 ret i80 %tmp 112} 113 114define i128 @test_bswap_i128(i128 %a) nounwind { 115; LA32-LABEL: test_bswap_i128: 116; LA32: # %bb.0: 117; LA32-NEXT: ld.w $a2, $a1, 12 118; LA32-NEXT: ld.w $a3, $a1, 0 119; LA32-NEXT: ld.w $a4, $a1, 8 120; LA32-NEXT: ld.w $a1, $a1, 4 121; LA32-NEXT: revb.2h $a2, $a2 122; LA32-NEXT: rotri.w $a2, $a2, 16 123; LA32-NEXT: revb.2h $a4, $a4 124; LA32-NEXT: rotri.w $a4, $a4, 16 125; LA32-NEXT: revb.2h $a1, $a1 126; LA32-NEXT: rotri.w $a1, $a1, 16 127; LA32-NEXT: revb.2h $a3, $a3 128; LA32-NEXT: rotri.w $a3, $a3, 16 129; LA32-NEXT: st.w $a3, $a0, 12 130; LA32-NEXT: st.w $a1, $a0, 8 131; LA32-NEXT: st.w $a4, $a0, 4 132; LA32-NEXT: st.w $a2, $a0, 0 133; LA32-NEXT: ret 134; 135; LA64-LABEL: test_bswap_i128: 136; LA64: # %bb.0: 137; LA64-NEXT: revb.d $a2, $a1 138; LA64-NEXT: revb.d $a1, $a0 139; LA64-NEXT: move $a0, $a2 140; LA64-NEXT: ret 141 %tmp = call i128 @llvm.bswap.i128(i128 %a) 142 ret i128 %tmp 143} 144