1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=XTENSA %s 4 5declare i16 @llvm.bswap.i16(i16) 6declare i32 @llvm.bswap.i32(i32) 7declare i64 @llvm.bswap.i64(i64) 8declare i8 @llvm.bitreverse.i8(i8) 9declare i16 @llvm.bitreverse.i16(i16) 10declare i32 @llvm.bitreverse.i32(i32) 11declare i64 @llvm.bitreverse.i64(i64) 12 13define i16 @test_bswap_i16(i16 %a) nounwind { 14; XTENSA-LABEL: test_bswap_i16: 15; XTENSA: l32r a8, .LCPI0_0 16; XTENSA-NEXT: and a8, a2, a8 17; XTENSA-NEXT: srli a8, a8, 8 18; XTENSA-NEXT: slli a9, a2, 8 19; XTENSA-NEXT: or a2, a9, a8 20; XTENSA-NEXT: ret 21 %tmp = call i16 @llvm.bswap.i16(i16 %a) 22 ret i16 %tmp 23} 24 25define i32 @test_bswap_i32(i32 %a) nounwind { 26; XTENSA-LABEL: test_bswap_i32: 27; XTENSA: srli a8, a2, 8 28; XTENSA-NEXT: l32r a9, .LCPI1_0 29; XTENSA-NEXT: and a8, a8, a9 30; XTENSA-NEXT: extui a10, a2, 24, 8 31; XTENSA-NEXT: or a8, a8, a10 32; XTENSA-NEXT: and a9, a2, a9 33; XTENSA-NEXT: slli a9, a9, 8 34; XTENSA-NEXT: slli a10, a2, 24 35; XTENSA-NEXT: or a9, a10, a9 36; XTENSA-NEXT: or a2, a9, a8 37; XTENSA-NEXT: ret 38 %tmp = call i32 @llvm.bswap.i32(i32 %a) 39 ret i32 %tmp 40} 41 42define i64 @test_bswap_i64(i64 %a) nounwind { 43; XTENSA-LABEL: test_bswap_i64: 44; XTENSA: srli a8, a3, 8 45; XTENSA-NEXT: l32r a9, .LCPI2_0 46; XTENSA-NEXT: and a8, a8, a9 47; XTENSA-NEXT: extui a10, a3, 24, 8 48; XTENSA-NEXT: or a8, a8, a10 49; XTENSA-NEXT: and a10, a3, a9 50; XTENSA-NEXT: slli a10, a10, 8 51; XTENSA-NEXT: slli a11, a3, 24 52; XTENSA-NEXT: or a10, a11, a10 53; XTENSA-NEXT: or a8, a10, a8 54; XTENSA-NEXT: srli a10, a2, 8 55; XTENSA-NEXT: and a10, a10, a9 56; XTENSA-NEXT: extui a11, a2, 24, 8 57; XTENSA-NEXT: or a10, a10, a11 58; XTENSA-NEXT: and a9, a2, a9 59; XTENSA-NEXT: slli a9, a9, 8 60; XTENSA-NEXT: slli a11, a2, 24 61; XTENSA-NEXT: or a9, a11, a9 62; XTENSA-NEXT: or a3, a9, a10 63; XTENSA-NEXT: or a2, a8, a8 64; XTENSA-NEXT: ret 65 %tmp = call i64 @llvm.bswap.i64(i64 %a) 66 ret i64 %tmp 67} 68 69define i8 @test_bitreverse_i8(i8 %a) nounwind { 70; XTENSA-LABEL: test_bitreverse_i8: 71; XTENSA: movi a8, 15 72; XTENSA-NEXT: and a8, a2, a8 73; XTENSA-NEXT: slli a8, a8, 4 74; XTENSA-NEXT: movi a9, 240 75; XTENSA-NEXT: and a9, a2, a9 76; XTENSA-NEXT: srli a9, a9, 4 77; XTENSA-NEXT: or a8, a9, a8 78; XTENSA-NEXT: srli a9, a8, 2 79; XTENSA-NEXT: movi a10, 51 80; XTENSA-NEXT: and a9, a9, a10 81; XTENSA-NEXT: and a8, a8, a10 82; XTENSA-NEXT: slli a8, a8, 2 83; XTENSA-NEXT: or a8, a9, a8 84; XTENSA-NEXT: srli a9, a8, 1 85; XTENSA-NEXT: movi a10, 85 86; XTENSA-NEXT: and a9, a9, a10 87; XTENSA-NEXT: and a8, a8, a10 88; XTENSA-NEXT: slli a8, a8, 1 89; XTENSA-NEXT: or a2, a9, a8 90; XTENSA-NEXT: ret 91 %tmp = call i8 @llvm.bitreverse.i8(i8 %a) 92 ret i8 %tmp 93} 94 95define i16 @test_bitreverse_i16(i16 %a) nounwind { 96; XTENSA-LABEL: test_bitreverse_i16: 97; XTENSA: l32r a8, .LCPI4_0 98; XTENSA-NEXT: and a8, a2, a8 99; XTENSA-NEXT: srli a8, a8, 8 100; XTENSA-NEXT: slli a9, a2, 8 101; XTENSA-NEXT: or a8, a9, a8 102; XTENSA-NEXT: srli a9, a8, 4 103; XTENSA-NEXT: l32r a10, .LCPI4_1 104; XTENSA-NEXT: and a9, a9, a10 105; XTENSA-NEXT: and a8, a8, a10 106; XTENSA-NEXT: slli a8, a8, 4 107; XTENSA-NEXT: or a8, a9, a8 108; XTENSA-NEXT: srli a9, a8, 2 109; XTENSA-NEXT: l32r a10, .LCPI4_2 110; XTENSA-NEXT: and a9, a9, a10 111; XTENSA-NEXT: and a8, a8, a10 112; XTENSA-NEXT: slli a8, a8, 2 113; XTENSA-NEXT: or a8, a9, a8 114; XTENSA-NEXT: srli a9, a8, 1 115; XTENSA-NEXT: l32r a10, .LCPI4_3 116; XTENSA-NEXT: and a9, a9, a10 117; XTENSA-NEXT: and a8, a8, a10 118; XTENSA-NEXT: slli a8, a8, 1 119; XTENSA-NEXT: or a2, a9, a8 120; XTENSA-NEXT: ret 121 %tmp = call i16 @llvm.bitreverse.i16(i16 %a) 122 ret i16 %tmp 123} 124 125define i32 @test_bitreverse_i32(i32 %a) nounwind { 126; XTENSA-LABEL: test_bitreverse_i32: 127; XTENSA: srli a8, a2, 8 128; XTENSA-NEXT: l32r a9, .LCPI5_0 129; XTENSA-NEXT: and a8, a8, a9 130; XTENSA-NEXT: extui a10, a2, 24, 8 131; XTENSA-NEXT: or a8, a8, a10 132; XTENSA-NEXT: and a9, a2, a9 133; XTENSA-NEXT: slli a9, a9, 8 134; XTENSA-NEXT: slli a10, a2, 24 135; XTENSA-NEXT: or a9, a10, a9 136; XTENSA-NEXT: or a8, a9, a8 137; XTENSA-NEXT: srli a9, a8, 4 138; XTENSA-NEXT: l32r a10, .LCPI5_1 139; XTENSA-NEXT: and a9, a9, a10 140; XTENSA-NEXT: and a8, a8, a10 141; XTENSA-NEXT: slli a8, a8, 4 142; XTENSA-NEXT: or a8, a9, a8 143; XTENSA-NEXT: srli a9, a8, 2 144; XTENSA-NEXT: l32r a10, .LCPI5_2 145; XTENSA-NEXT: and a9, a9, a10 146; XTENSA-NEXT: and a8, a8, a10 147; XTENSA-NEXT: slli a8, a8, 2 148; XTENSA-NEXT: or a8, a9, a8 149; XTENSA-NEXT: srli a9, a8, 1 150; XTENSA-NEXT: l32r a10, .LCPI5_3 151; XTENSA-NEXT: and a9, a9, a10 152; XTENSA-NEXT: and a8, a8, a10 153; XTENSA-NEXT: slli a8, a8, 1 154; XTENSA-NEXT: or a2, a9, a8 155; XTENSA-NEXT: ret 156 %tmp = call i32 @llvm.bitreverse.i32(i32 %a) 157 ret i32 %tmp 158} 159 160define i64 @test_bitreverse_i64(i64 %a) nounwind { 161; XTENSA-LABEL: test_bitreverse_i64: 162; XTENSA: srli a8, a3, 8 163; XTENSA-NEXT: l32r a9, .LCPI6_0 164; XTENSA-NEXT: and a8, a8, a9 165; XTENSA-NEXT: extui a10, a3, 24, 8 166; XTENSA-NEXT: or a8, a8, a10 167; XTENSA-NEXT: and a10, a3, a9 168; XTENSA-NEXT: slli a10, a10, 8 169; XTENSA-NEXT: slli a11, a3, 24 170; XTENSA-NEXT: or a10, a11, a10 171; XTENSA-NEXT: or a8, a10, a8 172; XTENSA-NEXT: srli a10, a8, 4 173; XTENSA-NEXT: l32r a11, .LCPI6_1 174; XTENSA-NEXT: and a10, a10, a11 175; XTENSA-NEXT: and a8, a8, a11 176; XTENSA-NEXT: slli a8, a8, 4 177; XTENSA-NEXT: or a8, a10, a8 178; XTENSA-NEXT: srli a10, a8, 2 179; XTENSA-NEXT: l32r a7, .LCPI6_2 180; XTENSA-NEXT: and a10, a10, a7 181; XTENSA-NEXT: and a8, a8, a7 182; XTENSA-NEXT: slli a8, a8, 2 183; XTENSA-NEXT: or a8, a10, a8 184; XTENSA-NEXT: srli a10, a8, 1 185; XTENSA-NEXT: l32r a6, .LCPI6_3 186; XTENSA-NEXT: and a10, a10, a6 187; XTENSA-NEXT: and a8, a8, a6 188; XTENSA-NEXT: slli a8, a8, 1 189; XTENSA-NEXT: or a8, a10, a8 190; XTENSA-NEXT: srli a10, a2, 8 191; XTENSA-NEXT: and a10, a10, a9 192; XTENSA-NEXT: extui a5, a2, 24, 8 193; XTENSA-NEXT: or a10, a10, a5 194; XTENSA-NEXT: and a9, a2, a9 195; XTENSA-NEXT: slli a9, a9, 8 196; XTENSA-NEXT: slli a5, a2, 24 197; XTENSA-NEXT: or a9, a5, a9 198; XTENSA-NEXT: or a9, a9, a10 199; XTENSA-NEXT: srli a10, a9, 4 200; XTENSA-NEXT: and a10, a10, a11 201; XTENSA-NEXT: and a9, a9, a11 202; XTENSA-NEXT: slli a9, a9, 4 203; XTENSA-NEXT: or a9, a10, a9 204; XTENSA-NEXT: srli a10, a9, 2 205; XTENSA-NEXT: and a10, a10, a7 206; XTENSA-NEXT: and a9, a9, a7 207; XTENSA-NEXT: slli a9, a9, 2 208; XTENSA-NEXT: or a9, a10, a9 209; XTENSA-NEXT: srli a10, a9, 1 210; XTENSA-NEXT: and a10, a10, a6 211; XTENSA-NEXT: and a9, a9, a6 212; XTENSA-NEXT: slli a9, a9, 1 213; XTENSA-NEXT: or a3, a10, a9 214; XTENSA-NEXT: or a2, a8, a8 215; XTENSA-NEXT: ret 216 %tmp = call i64 @llvm.bitreverse.i64(i64 %a) 217 ret i64 %tmp 218} 219 220define i16 @test_bswap_bitreverse_i16(i16 %a) nounwind { 221; XTENSA-LABEL: test_bswap_bitreverse_i16: 222; XTENSA: srli a8, a2, 4 223; XTENSA-NEXT: l32r a9, .LCPI7_0 224; XTENSA-NEXT: and a8, a8, a9 225; XTENSA-NEXT: and a9, a2, a9 226; XTENSA-NEXT: slli a9, a9, 4 227; XTENSA-NEXT: or a8, a8, a9 228; XTENSA-NEXT: srli a9, a8, 2 229; XTENSA-NEXT: l32r a10, .LCPI7_1 230; XTENSA-NEXT: and a9, a9, a10 231; XTENSA-NEXT: and a8, a8, a10 232; XTENSA-NEXT: slli a8, a8, 2 233; XTENSA-NEXT: or a8, a9, a8 234; XTENSA-NEXT: srli a9, a8, 1 235; XTENSA-NEXT: l32r a10, .LCPI7_2 236; XTENSA-NEXT: and a9, a9, a10 237; XTENSA-NEXT: and a8, a8, a10 238; XTENSA-NEXT: slli a8, a8, 1 239; XTENSA-NEXT: or a2, a9, a8 240; XTENSA-NEXT: ret 241 %tmp = call i16 @llvm.bswap.i16(i16 %a) 242 %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp) 243 ret i16 %tmp2 244} 245 246define i32 @test_bswap_bitreverse_i32(i32 %a) nounwind { 247; XTENSA-LABEL: test_bswap_bitreverse_i32: 248; XTENSA: srli a8, a2, 4 249; XTENSA-NEXT: l32r a9, .LCPI8_0 250; XTENSA-NEXT: and a8, a8, a9 251; XTENSA-NEXT: and a9, a2, a9 252; XTENSA-NEXT: slli a9, a9, 4 253; XTENSA-NEXT: or a8, a8, a9 254; XTENSA-NEXT: srli a9, a8, 2 255; XTENSA-NEXT: l32r a10, .LCPI8_1 256; XTENSA-NEXT: and a9, a9, a10 257; XTENSA-NEXT: and a8, a8, a10 258; XTENSA-NEXT: slli a8, a8, 2 259; XTENSA-NEXT: or a8, a9, a8 260; XTENSA-NEXT: srli a9, a8, 1 261; XTENSA-NEXT: l32r a10, .LCPI8_2 262; XTENSA-NEXT: and a9, a9, a10 263; XTENSA-NEXT: and a8, a8, a10 264; XTENSA-NEXT: slli a8, a8, 1 265; XTENSA-NEXT: or a2, a9, a8 266; XTENSA-NEXT: ret 267 %tmp = call i32 @llvm.bswap.i32(i32 %a) 268 %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp) 269 ret i32 %tmp2 270} 271 272define i64 @test_bswap_bitreverse_i64(i64 %a) nounwind { 273; XTENSA-LABEL: test_bswap_bitreverse_i64: 274; XTENSA: srli a8, a2, 4 275; XTENSA-NEXT: l32r a9, .LCPI9_0 276; XTENSA-NEXT: and a8, a8, a9 277; XTENSA-NEXT: and a10, a2, a9 278; XTENSA-NEXT: slli a10, a10, 4 279; XTENSA-NEXT: or a8, a8, a10 280; XTENSA-NEXT: srli a10, a8, 2 281; XTENSA-NEXT: l32r a11, .LCPI9_1 282; XTENSA-NEXT: and a10, a10, a11 283; XTENSA-NEXT: and a8, a8, a11 284; XTENSA-NEXT: slli a8, a8, 2 285; XTENSA-NEXT: or a8, a10, a8 286; XTENSA-NEXT: srli a10, a8, 1 287; XTENSA-NEXT: l32r a7, .LCPI9_2 288; XTENSA-NEXT: and a10, a10, a7 289; XTENSA-NEXT: and a8, a8, a7 290; XTENSA-NEXT: slli a8, a8, 1 291; XTENSA-NEXT: or a2, a10, a8 292; XTENSA-NEXT: srli a8, a3, 4 293; XTENSA-NEXT: and a8, a8, a9 294; XTENSA-NEXT: and a9, a3, a9 295; XTENSA-NEXT: slli a9, a9, 4 296; XTENSA-NEXT: or a8, a8, a9 297; XTENSA-NEXT: srli a9, a8, 2 298; XTENSA-NEXT: and a9, a9, a11 299; XTENSA-NEXT: and a8, a8, a11 300; XTENSA-NEXT: slli a8, a8, 2 301; XTENSA-NEXT: or a8, a9, a8 302; XTENSA-NEXT: srli a9, a8, 1 303; XTENSA-NEXT: and a9, a9, a7 304; XTENSA-NEXT: and a8, a8, a7 305; XTENSA-NEXT: slli a8, a8, 1 306; XTENSA-NEXT: or a3, a9, a8 307; XTENSA-NEXT: ret 308 %tmp = call i64 @llvm.bswap.i64(i64 %a) 309 %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp) 310 ret i64 %tmp2 311} 312 313define i16 @test_bitreverse_bswap_i16(i16 %a) nounwind { 314; XTENSA-LABEL: test_bitreverse_bswap_i16: 315; XTENSA: srli a8, a2, 4 316; XTENSA-NEXT: l32r a9, .LCPI10_0 317; XTENSA-NEXT: and a8, a8, a9 318; XTENSA-NEXT: and a9, a2, a9 319; XTENSA-NEXT: slli a9, a9, 4 320; XTENSA-NEXT: or a8, a8, a9 321; XTENSA-NEXT: srli a9, a8, 2 322; XTENSA-NEXT: l32r a10, .LCPI10_1 323; XTENSA-NEXT: and a9, a9, a10 324; XTENSA-NEXT: and a8, a8, a10 325; XTENSA-NEXT: slli a8, a8, 2 326; XTENSA-NEXT: or a8, a9, a8 327; XTENSA-NEXT: srli a9, a8, 1 328; XTENSA-NEXT: l32r a10, .LCPI10_2 329; XTENSA-NEXT: and a9, a9, a10 330; XTENSA-NEXT: and a8, a8, a10 331; XTENSA-NEXT: slli a8, a8, 1 332; XTENSA-NEXT: or a2, a9, a8 333; XTENSA-NEXT: ret 334 %tmp = call i16 @llvm.bitreverse.i16(i16 %a) 335 %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp) 336 ret i16 %tmp2 337} 338 339define i32 @test_bitreverse_bswap_i32(i32 %a) nounwind { 340; XTENSA-LABEL: test_bitreverse_bswap_i32: 341; XTENSA: srli a8, a2, 4 342; XTENSA-NEXT: l32r a9, .LCPI11_0 343; XTENSA-NEXT: and a8, a8, a9 344; XTENSA-NEXT: and a9, a2, a9 345; XTENSA-NEXT: slli a9, a9, 4 346; XTENSA-NEXT: or a8, a8, a9 347; XTENSA-NEXT: srli a9, a8, 2 348; XTENSA-NEXT: l32r a10, .LCPI11_1 349; XTENSA-NEXT: and a9, a9, a10 350; XTENSA-NEXT: and a8, a8, a10 351; XTENSA-NEXT: slli a8, a8, 2 352; XTENSA-NEXT: or a8, a9, a8 353; XTENSA-NEXT: srli a9, a8, 1 354; XTENSA-NEXT: l32r a10, .LCPI11_2 355; XTENSA-NEXT: and a9, a9, a10 356; XTENSA-NEXT: and a8, a8, a10 357; XTENSA-NEXT: slli a8, a8, 1 358; XTENSA-NEXT: or a2, a9, a8 359; XTENSA-NEXT: ret 360 %tmp = call i32 @llvm.bitreverse.i32(i32 %a) 361 %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp) 362 ret i32 %tmp2 363} 364 365define i64 @test_bitreverse_bswap_i64(i64 %a) nounwind { 366; XTENSA-LABEL: test_bitreverse_bswap_i64: 367; XTENSA: srli a8, a2, 4 368; XTENSA-NEXT: l32r a9, .LCPI12_0 369; XTENSA-NEXT: and a8, a8, a9 370; XTENSA-NEXT: and a10, a2, a9 371; XTENSA-NEXT: slli a10, a10, 4 372; XTENSA-NEXT: or a8, a8, a10 373; XTENSA-NEXT: srli a10, a8, 2 374; XTENSA-NEXT: l32r a11, .LCPI12_1 375; XTENSA-NEXT: and a10, a10, a11 376; XTENSA-NEXT: and a8, a8, a11 377; XTENSA-NEXT: slli a8, a8, 2 378; XTENSA-NEXT: or a8, a10, a8 379; XTENSA-NEXT: srli a10, a8, 1 380; XTENSA-NEXT: l32r a7, .LCPI12_2 381; XTENSA-NEXT: and a10, a10, a7 382; XTENSA-NEXT: and a8, a8, a7 383; XTENSA-NEXT: slli a8, a8, 1 384; XTENSA-NEXT: or a2, a10, a8 385; XTENSA-NEXT: srli a8, a3, 4 386; XTENSA-NEXT: and a8, a8, a9 387; XTENSA-NEXT: and a9, a3, a9 388; XTENSA-NEXT: slli a9, a9, 4 389; XTENSA-NEXT: or a8, a8, a9 390; XTENSA-NEXT: srli a9, a8, 2 391; XTENSA-NEXT: and a9, a9, a11 392; XTENSA-NEXT: and a8, a8, a11 393; XTENSA-NEXT: slli a8, a8, 2 394; XTENSA-NEXT: or a8, a9, a8 395; XTENSA-NEXT: srli a9, a8, 1 396; XTENSA-NEXT: and a9, a9, a7 397; XTENSA-NEXT: and a8, a8, a7 398; XTENSA-NEXT: slli a8, a8, 1 399; XTENSA-NEXT: or a3, a9, a8 400; XTENSA-NEXT: ret 401 %tmp = call i64 @llvm.bitreverse.i64(i64 %a) 402 %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp) 403 ret i64 %tmp2 404} 405