1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mipsel -mcpu=mips32r2 | FileCheck %s -check-prefix=MIPS32 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64el -mcpu=mips64r2 | FileCheck %s -check-prefix=MIPS64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips32r2 -mattr=+mips16 | FileCheck %s -check-prefix=MIPS16 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @bswap32(i32 signext %x) nounwind readnone { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker; MIPS32-LABEL: bswap32: 8*9880d681SAndroid Build Coastguard Worker; MIPS32: wsbh $[[R0:[0-9]+]] 9*9880d681SAndroid Build Coastguard Worker; MIPS32: rotr ${{[0-9]+}}, $[[R0]], 16 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; MIPS64-LABEL: bswap32: 12*9880d681SAndroid Build Coastguard Worker; MIPS64: wsbh $[[R0:[0-9]+]] 13*9880d681SAndroid Build Coastguard Worker; MIPS64: rotr ${{[0-9]+}}, $[[R0]], 16 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; MIPS16-LABEL: bswap32: 16*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R0:[0-9]+]], $4, 8 17*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R1:[0-9]+]], $4, 24 18*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R2:[0-9]+]], $4, 8 19*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R3:[0-9]+]], $4, 24 20*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: li $[[R4:[0-9]+]], 65280 21*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R4]], $[[R0]] 22*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R1]], $[[R4]] 23*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: lw $[[R7:[0-9]+]], $CPI 24*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R7]], $[[R2]] 25*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R7]] 26*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R1]] 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker %or.3 = call i32 @llvm.bswap.i32(i32 %x) 29*9880d681SAndroid Build Coastguard Worker ret i32 %or.3 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine i64 @bswap64(i64 signext %x) nounwind readnone { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker; MIPS32-LABEL: bswap64: 35*9880d681SAndroid Build Coastguard Worker; MIPS32: wsbh $[[R0:[0-9]+]] 36*9880d681SAndroid Build Coastguard Worker; MIPS32: rotr ${{[0-9]+}}, $[[R0]], 16 37*9880d681SAndroid Build Coastguard Worker; MIPS32: wsbh $[[R0:[0-9]+]] 38*9880d681SAndroid Build Coastguard Worker; MIPS32: rotr ${{[0-9]+}}, $[[R0]], 16 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; MIPS64-LABEL: bswap64: 41*9880d681SAndroid Build Coastguard Worker; MIPS64: dsbh $[[R0:[0-9]+]] 42*9880d681SAndroid Build Coastguard Worker; MIPS64: dshd ${{[0-9]+}}, $[[R0]] 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; MIPS16-LABEL: bswap64: 45*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R0:[0-9]+]], $5, 8 46*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R1:[0-9]+]], $5, 24 47*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R2:[0-9]+]], $5, 8 48*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R3:[0-9]+]], $5, 24 49*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: li $[[R4:[0-9]+]], 65280 50*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R0]], $[[R4]] 51*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R1]], $[[R0]] 52*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: lw $[[R7:[0-9]+]], 1f 53*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R2]], $[[R7]] 54*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R2]] 55*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R1]] 56*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R0:[0-9]+]], $4, 8 57*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: srl $[[R1:[0-9]+]], $4, 24 58*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R2:[0-9]+]], $4, 8 59*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: sll $[[R3:[0-9]+]], $4, 24 60*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: li $[[R4:[0-9]+]], 65280 61*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R0]], $[[R4]] 62*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R1]], $[[R0]] 63*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: lw $[[R7:[0-9]+]], 1f 64*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: and $[[R2]], $[[R7]] 65*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R2]] 66*9880d681SAndroid Build Coastguard Worker; MIPS16-DAG: or $[[R3]], $[[R1]] 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker %or.7 = call i64 @llvm.bswap.i64(i64 %x) 69*9880d681SAndroid Build Coastguard Worker ret i64 %or.7 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @bswapv4i32(<4 x i32> %x) nounwind readnone { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker; MIPS32-LABEL: bswapv4i32: 75*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: wsbh $[[R0:[0-9]+]] 76*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 77*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: wsbh $[[R0:[0-9]+]] 78*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 79*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: wsbh $[[R0:[0-9]+]] 80*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 81*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: wsbh $[[R0:[0-9]+]] 82*9880d681SAndroid Build Coastguard Worker; MIPS32-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; MIPS64-LABEL: bswapv4i32: 85*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: wsbh $[[R0:[0-9]+]] 86*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 87*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: wsbh $[[R0:[0-9]+]] 88*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 89*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: wsbh $[[R0:[0-9]+]] 90*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 91*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: wsbh $[[R0:[0-9]+]] 92*9880d681SAndroid Build Coastguard Worker; MIPS64-DAG: rotr ${{[0-9]+}}, $[[R0]], 16 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; Don't bother with a MIPS16 version. It's just bswap32 repeated four times and 95*9880d681SAndroid Build Coastguard Worker; would be very long 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker %ret = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %x) 98*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.bswap.i32(i32) nounwind readnone 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.bswap.i64(i64) nounwind readnone 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.bswap.v4i32(<4 x i32>) nounwind readnone 106