1# RUN: llc -mtriple=i386-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32 2# RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64 3 4--- | 5 define i8 @test_zext_i1toi8(i1 %a) { 6 %r = zext i1 %a to i8 7 ret i8 %r 8 } 9 10 define i16 @test_zext_i1toi16(i1 %a) { 11 %r = zext i1 %a to i16 12 ret i16 %r 13 } 14 15 define i32 @test_zext_i1(i1 %a) { 16 %r = zext i1 %a to i32 17 ret i32 %r 18 } 19 20 define i32 @test_zext_i8(i8 %val) { 21 %r = zext i8 %val to i32 22 ret i32 %r 23 } 24 25 define i32 @test_zext_i16(i16 %val) { 26 %r = zext i16 %val to i32 27 ret i32 %r 28 } 29 30 define i32 @test_sext_i8(i8 %val) { 31 %r = sext i8 %val to i32 32 ret i32 %r 33 } 34 35 define i32 @test_sext_i16(i16 %val) { 36 %r = sext i16 %val to i32 37 ret i32 %r 38 } 39 40 define void @test_anyext_i1toi8() { ret void } 41 define void @test_anyext_i1toi16() { ret void } 42 define void @test_anyext_i1toi32() { ret void } 43 define void @test_anyext_i8toi16() { ret void } 44 define void @test_anyext_i8toi32() { ret void } 45 define void @test_anyext_i16toi32() { ret void } 46 47... 48--- 49name: test_zext_i1toi8 50# ALL-LABEL: name: test_zext_i1toi8 51alignment: 16 52legalized: true 53regBankSelected: true 54# X32: registers: 55# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 56# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 57# X32-NEXT: - { id: 2, class: gr8, preferred-register: '' } 58# 59# X64: registers: 60# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 61# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 62# X64-NEXT: - { id: 2, class: gr8, preferred-register: '' } 63registers: 64 - { id: 0, class: gpr, preferred-register: '' } 65 - { id: 1, class: gpr, preferred-register: '' } 66 - { id: 2, class: gpr, preferred-register: '' } 67# X32: %0:gr32_abcd = COPY $edi 68# X64: %0:gr32 = COPY $edi 69# ALL_NEXT: %1:gr8 = COPY %0.sub_8bit 70# ALL_NEXT: %2:gr8 = AND8ri %1, 1, implicit-def $eflags 71# ALL_NEXT: $al = COPY %2 72# ALL_NEXT: RET 0, implicit $al 73body: | 74 bb.1 (%ir-block.0): 75 liveins: $edi 76 77 %0(s32) = COPY $edi 78 %1(s1) = G_TRUNC %0(s32) 79 %2(s8) = G_ZEXT %1(s1) 80 $al = COPY %2(s8) 81 RET 0, implicit $al 82 83... 84--- 85name: test_zext_i1toi16 86# ALL-LABEL: name: test_zext_i1toi16 87alignment: 16 88legalized: true 89regBankSelected: true 90# X32: registers: 91# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 92# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 93# X32-NEXT: - { id: 2, class: gr16, preferred-register: '' } 94# X32-NEXT: - { id: 3, class: gr16, preferred-register: '' } 95# 96# X64: registers: 97# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 98# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 99# X64-NEXT: - { id: 2, class: gr16, preferred-register: '' } 100# X64-NEXT: - { id: 3, class: gr16, preferred-register: '' } 101registers: 102 - { id: 0, class: gpr, preferred-register: '' } 103 - { id: 1, class: gpr, preferred-register: '' } 104 - { id: 2, class: gpr, preferred-register: '' } 105# X32: %0:gr32_abcd = COPY $edi 106# X64: %0:gr32 = COPY $edi 107# ALL_NEXT: %1:gr8 = COPY %0.sub_8bit 108# ALL_NEXT: %3:gr16 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit 109# ALL_NEXT: %2:gr16 = AND16ri8 %3, 1, implicit-def $eflags 110# ALL_NEXT: $ax = COPY %2 111# ALL_NEXT: RET 0, implicit $ax 112body: | 113 bb.1 (%ir-block.0): 114 liveins: $edi 115 116 %0(s32) = COPY $edi 117 %1(s1) = G_TRUNC %0(s32) 118 %2(s16) = G_ZEXT %1(s1) 119 $ax = COPY %2(s16) 120 RET 0, implicit $ax 121 122... 123--- 124name: test_zext_i1 125# ALL-LABEL: name: test_zext_i1 126alignment: 16 127legalized: true 128regBankSelected: true 129# X32: registers: 130# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 131# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 132# X32-NEXT: - { id: 2, class: gr32, preferred-register: '' } 133# X32-NEXT: - { id: 3, class: gr32, preferred-register: '' } 134# 135# X64: registers: 136# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 137# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 138# X64-NEXT: - { id: 2, class: gr32, preferred-register: '' } 139# X64-NEXT: - { id: 3, class: gr32, preferred-register: '' } 140registers: 141 - { id: 0, class: gpr } 142 - { id: 1, class: gpr } 143 - { id: 2, class: gpr } 144# X32: %0:gr32_abcd = COPY $edi 145# X64: %0:gr32 = COPY $edi 146# ALL_NEXT: %1:gr8 = COPY %0.sub_8bit 147# ALL_NEXT: %3:gr32 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit 148# ALL_NEXT: %2:gr32 = AND32ri8 %3, 1, implicit-def $eflags 149# ALL_NEXT: $eax = COPY %2 150# ALL_NEXT: RET 0, implicit $eax 151body: | 152 bb.1 (%ir-block.0): 153 liveins: $edi 154 155 %0(s32) = COPY $edi 156 %1(s1) = G_TRUNC %0(s32) 157 %2(s32) = G_ZEXT %1(s1) 158 $eax = COPY %2(s32) 159 RET 0, implicit $eax 160 161... 162--- 163name: test_zext_i8 164# ALL-LABEL: name: test_zext_i8 165alignment: 16 166legalized: true 167regBankSelected: true 168# ALL: registers: 169# ALL-NEXT: - { id: 0, class: gr8, preferred-register: '' } 170# ALL-NEXT: - { id: 1, class: gr32, preferred-register: '' } 171registers: 172 - { id: 0, class: gpr } 173 - { id: 1, class: gpr } 174# ALL: %0:gr8 = COPY $dil 175# ALL-NEXT: %1:gr32 = MOVZX32rr8 %0 176# ALL-NEXT: $eax = COPY %1 177# ALL-NEXT: RET 0, implicit $eax 178body: | 179 bb.1 (%ir-block.0): 180 liveins: $edi 181 182 %0(s8) = COPY $dil 183 %1(s32) = G_ZEXT %0(s8) 184 $eax = COPY %1(s32) 185 RET 0, implicit $eax 186 187... 188--- 189name: test_zext_i16 190# ALL-LABEL: name: test_zext_i16 191alignment: 16 192legalized: true 193regBankSelected: true 194# ALL: registers: 195# ALL-NEXT: - { id: 0, class: gr16, preferred-register: '' } 196# ALL-NEXT: - { id: 1, class: gr32, preferred-register: '' } 197registers: 198 - { id: 0, class: gpr } 199 - { id: 1, class: gpr } 200# ALL: %0:gr16 = COPY $di 201# ALL-NEXT: %1:gr32 = MOVZX32rr16 %0 202# ALL-NEXT: $eax = COPY %1 203# ALL-NEXT: RET 0, implicit $eax 204body: | 205 bb.1 (%ir-block.0): 206 liveins: $edi 207 208 %0(s16) = COPY $di 209 %1(s32) = G_ZEXT %0(s16) 210 $eax = COPY %1(s32) 211 RET 0, implicit $eax 212 213... 214--- 215name: test_sext_i8 216# ALL-LABEL: name: test_sext_i8 217alignment: 16 218legalized: true 219regBankSelected: true 220# ALL: registers: 221# ALL-NEXT: - { id: 0, class: gr8, preferred-register: '' } 222# ALL-NEXT: - { id: 1, class: gr32, preferred-register: '' } 223registers: 224 - { id: 0, class: gpr } 225 - { id: 1, class: gpr } 226# ALL: %0:gr8 = COPY $dil 227# ALL-NEXT: %1:gr32 = MOVSX32rr8 %0 228# ALL-NEXT: $eax = COPY %1 229# ALL-NEXT: RET 0, implicit $eax 230body: | 231 bb.1 (%ir-block.0): 232 liveins: $edi 233 234 %0(s8) = COPY $dil 235 %1(s32) = G_SEXT %0(s8) 236 $eax = COPY %1(s32) 237 RET 0, implicit $eax 238 239... 240--- 241name: test_sext_i16 242# ALL-LABEL: name: test_sext_i16 243alignment: 16 244legalized: true 245regBankSelected: true 246# ALL: registers: 247# ALL-NEXT: - { id: 0, class: gr16, preferred-register: '' } 248# ALL-NEXT: - { id: 1, class: gr32, preferred-register: '' } 249registers: 250 - { id: 0, class: gpr } 251 - { id: 1, class: gpr } 252# ALL: %0:gr16 = COPY $di 253# ALL-NEXT: %1:gr32 = MOVSX32rr16 %0 254# ALL-NEXT: $eax = COPY %1 255# ALL-NEXT: RET 0, implicit $eax 256body: | 257 bb.1 (%ir-block.0): 258 liveins: $edi 259 260 %0(s16) = COPY $di 261 %1(s32) = G_SEXT %0(s16) 262 $eax = COPY %1(s32) 263 RET 0, implicit $eax 264 265... 266--- 267name: test_anyext_i1toi8 268# ALL-LABEL: name: test_anyext_i1toi8 269alignment: 16 270legalized: true 271regBankSelected: true 272# X32: registers: 273# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 274# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 275# X32-NEXT: - { id: 2, class: gr8, preferred-register: '' } 276# 277# X64: registers: 278# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 279# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 280# X64-NEXT: - { id: 2, class: gr8, preferred-register: '' } 281registers: 282 - { id: 0, class: gpr } 283 - { id: 1, class: gpr } 284 - { id: 2, class: gpr } 285# X32: %0:gr32_abcd = COPY $edi 286# X64: %0:gr32 = COPY $edi 287# ALL-NEXT: %1:gr8 = COPY %0.sub_8bit 288# ALL-NEXT: $al = COPY %1 289# ALL-NEXT: RET 0, implicit $al 290body: | 291 bb.1 (%ir-block.0): 292 liveins: $edi 293 294 %0(s32) = COPY $edi 295 %1(s1) = G_TRUNC %0(s32) 296 %2(s8) = G_ANYEXT %1(s1) 297 $al = COPY %2(s8) 298 RET 0, implicit $al 299... 300--- 301name: test_anyext_i1toi16 302# ALL-LABEL: name: test_anyext_i1toi16 303alignment: 16 304legalized: true 305regBankSelected: true 306# X32: registers: 307# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 308# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 309# X32-NEXT: - { id: 2, class: gr16, preferred-register: '' } 310# 311# X64: registers: 312# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 313# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 314# X64-NEXT: - { id: 2, class: gr16, preferred-register: '' } 315registers: 316 - { id: 0, class: gpr } 317 - { id: 1, class: gpr } 318 - { id: 2, class: gpr } 319# X32: %0:gr32_abcd = COPY $edi 320# X64: %0:gr32 = COPY $edi 321# ALL-NEXT: %1:gr8 = COPY %0.sub_8bit 322# ALL-NEXT: %2:gr16 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit 323# ALL-NEXT: $ax = COPY %2 324# ALL-NEXT: RET 0, implicit $ax 325body: | 326 bb.1 (%ir-block.0): 327 liveins: $edi 328 329 %0(s32) = COPY $edi 330 %1(s1) = G_TRUNC %0(s32) 331 %2(s16) = G_ANYEXT %1(s1) 332 $ax = COPY %2(s16) 333 RET 0, implicit $ax 334... 335--- 336name: test_anyext_i1toi32 337# ALL-LABEL: name: test_anyext_i1toi32 338alignment: 16 339legalized: true 340regBankSelected: true 341# X32: registers: 342# X32-NEXT: - { id: 0, class: gr32_abcd, preferred-register: '' } 343# X32-NEXT: - { id: 1, class: gr8, preferred-register: '' } 344# X32-NEXT: - { id: 2, class: gr32, preferred-register: '' } 345# 346# X64: registers: 347# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 348# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 349# X64-NEXT: - { id: 2, class: gr32, preferred-register: '' } 350registers: 351 - { id: 0, class: gpr } 352 - { id: 1, class: gpr } 353 - { id: 2, class: gpr } 354# X32: %0:gr32_abcd = COPY $edi 355# X64: %0:gr32 = COPY $edi 356# ALL-NEXT: %1:gr8 = COPY %0.sub_8bit 357# ALL-NEXT: %2:gr32 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit 358# ALL-NEXT: $eax = COPY %2 359# ALL-NEXT: RET 0, implicit $eax 360body: | 361 bb.1 (%ir-block.0): 362 liveins: $edi 363 364 %0(s32) = COPY $edi 365 %1(s1) = G_TRUNC %0(s32) 366 %2(s32) = G_ANYEXT %1(s1) 367 $eax = COPY %2(s32) 368 RET 0, implicit $eax 369... 370--- 371name: test_anyext_i8toi16 372# ALL-LABEL: name: test_anyext_i8toi16 373alignment: 16 374legalized: true 375regBankSelected: true 376# X32: registers: 377# X32-NEXT: - { id: 0, class: gr32, preferred-register: '' } 378# X32-NEXT: - { id: 1, class: gr8_abcd_l, preferred-register: '' } 379# X32-NEXT: - { id: 2, class: gr16, preferred-register: '' } 380# 381# X64: registers: 382# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 383# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 384# X64-NEXT: - { id: 2, class: gr16, preferred-register: '' } 385registers: 386 - { id: 0, class: gpr } 387 - { id: 1, class: gpr } 388 - { id: 2, class: gpr } 389# X32: %0:gr32 = COPY $edi 390# X32-NEXT: %4:gr32_abcd = COPY %0 391# X32-NEXT: %1:gr8_abcd_l = COPY %4.sub_8bit 392 393# X64: %0:gr32 = COPY $edi 394# X64-NEXT: %1:gr8 = COPY %0.sub_8bit 395 396# ALL-NEXT: %3:gr32 = MOVZX32rr8 %1 397# ALL-NEXT: %2:gr16 = COPY %3.sub_16bit 398# ALL-NEXT: $ax = COPY %2 399# ALL-NEXT: RET 0, implicit $ax 400body: | 401 bb.1 (%ir-block.0): 402 liveins: $edi 403 404 %0(s32) = COPY $edi 405 %1(s8) = G_TRUNC %0(s32) 406 %2(s16) = G_ANYEXT %1(s8) 407 $ax = COPY %2(s16) 408 RET 0, implicit $ax 409... 410--- 411name: test_anyext_i8toi32 412# ALL-LABEL: name: test_anyext_i8toi32 413alignment: 16 414legalized: true 415regBankSelected: true 416# X32: registers: 417# X32-NEXT: - { id: 0, class: gr32, preferred-register: '' } 418# X32-NEXT: - { id: 1, class: gr8_abcd_l, preferred-register: '' } 419# X32-NEXT: - { id: 2, class: gr32, preferred-register: '' } 420# 421# X64: registers: 422# X64-NEXT: - { id: 0, class: gr32, preferred-register: '' } 423# X64-NEXT: - { id: 1, class: gr8, preferred-register: '' } 424# X64-NEXT: - { id: 2, class: gr32, preferred-register: '' } 425registers: 426 - { id: 0, class: gpr } 427 - { id: 1, class: gpr } 428 - { id: 2, class: gpr } 429# X32: %0:gr32 = COPY $edi 430# X32-NEXT: %3:gr32_abcd = COPY %0 431# X32-NEXT: %1:gr8_abcd_l = COPY %3.sub_8bit 432 433# X64: %0:gr32 = COPY $edi 434# X64-NEXT: %1:gr8 = COPY %0.sub_8bit 435 436# ALL-NEXT: %2:gr32 = MOVZX32rr8 %1 437# ALL-NEXT: $eax = COPY %2 438# ALL-NEXT: RET 0, implicit $eax 439body: | 440 bb.1 (%ir-block.0): 441 liveins: $edi 442 443 %0(s32) = COPY $edi 444 %1(s8) = G_TRUNC %0(s32) 445 %2(s32) = G_ANYEXT %1(s8) 446 $eax = COPY %2(s32) 447 RET 0, implicit $eax 448... 449--- 450name: test_anyext_i16toi32 451# ALL-LABEL: name: test_anyext_i16toi32 452alignment: 16 453legalized: true 454regBankSelected: true 455# ALL: registers: 456# ALL-NEXT: - { id: 0, class: gr32, preferred-register: '' } 457# ALL-NEXT: - { id: 1, class: gr16, preferred-register: '' } 458# ALL-NEXT: - { id: 2, class: low32_addr_access_rbp, preferred-register: '' } 459# ALL-NEXT: - { id: 3, class: low32_addr_access_rbp, preferred-register: '' } 460registers: 461 - { id: 0, class: gpr } 462 - { id: 1, class: gpr } 463 - { id: 2, class: gpr } 464# ALL: %0:gr32 = COPY $edi 465# ALL-NEXT: %1:gr16 = COPY %0.sub_16bit 466# ALL-NEXT: %3:low32_addr_access_rbp = IMPLICIT_DEF 467# ALL-NEXT: %2:low32_addr_access_rbp = INSERT_SUBREG %3, %1, %subreg.sub_16bit 468# ALL-NEXT: $eax = COPY %2 469# ALL-NEXT: RET 0, implicit $eax 470body: | 471 bb.1 (%ir-block.0): 472 liveins: $edi 473 474 %0(s32) = COPY $edi 475 %1(s16) = G_TRUNC %0(s32) 476 %2(s32) = G_ANYEXT %1(s16) 477 $eax = COPY %2(s32) 478 RET 0, implicit $eax 479... 480