1 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=0 | \ 2 ; RUN: FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s 3 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \ 4 ; RUN: FileCheck -check-prefix=CHECK -check-prefix=BWON %s 5 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -fixup-byte-word-insts=0 | \ 6 ; RUN: FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s 7 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \ 8 ; RUN: FileCheck -check-prefix=CHECK -check-prefix=BWON %s 9 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=0 | \ 10 ; RUN: FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWOFF %s 11 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=1 | \ 12 ; RUN: FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWON %s 13 14 15 @x = common global i32 0, align 4 16 17 define zeroext i1 @unsigned_i1() { 18 entry: 19 %0 = load i32, i32* @x 20 %cmp = icmp eq i32 %0, 42 21 ret i1 %cmp 22 23 ; Unsigned i1 return values are not extended. 24 ; CHECK-LABEL: unsigned_i1: 25 ; CHECK: cmp 26 ; CHECK-NEXT: sete 27 ; CHECK-NEXT: ret 28 } 29 30 define zeroext i8 @unsigned_i8() { 31 entry: 32 %0 = load i32, i32* @x 33 %cmp = icmp eq i32 %0, 42 34 %retval = zext i1 %cmp to i8 35 ret i8 %retval 36 37 ; Unsigned i8 return values are not extended. 38 ; CHECK-LABEL: unsigned_i8: 39 ; CHECK: cmp 40 ; CHECK-NEXT: sete 41 ; CHECK-NEXT: ret 42 43 ; Except on Darwin, for legacy reasons. 44 ; DARWIN-LABEL: unsigned_i8: 45 ; DARWIN: xorl 46 ; DARWIN-NEXT: cmp 47 ; DARWIN-NEXT: sete 48 ; DARWIN-NEXT: ret 49 } 50 51 define signext i8 @signed_i8() { 52 entry: 53 %0 = load i32, i32* @x 54 %cmp = icmp eq i32 %0, 42 55 %retval = zext i1 %cmp to i8 56 ret i8 %retval 57 58 ; Signed i8 return values are not extended. 59 ; CHECK-LABEL: signed_i8: 60 ; CHECK: cmp 61 ; CHECK-NEXT: sete 62 ; CHECK-NEXT: ret 63 64 ; Except on Darwin, for legacy reasons. 65 ; DARWIN-LABEL: signed_i8: 66 ; DARWIN: xorl 67 ; DARWIN-NEXT: cmp 68 ; DARWIN-NEXT: sete 69 ; DARWIN-NEXT: ret 70 } 71 72 @a = common global i16 0 73 @b = common global i16 0 74 define zeroext i16 @unsigned_i16() { 75 entry: 76 %0 = load i16, i16* @a 77 %1 = load i16, i16* @b 78 %add = add i16 %1, %0 79 ret i16 %add 80 81 ; i16 return values are not extended. 82 ; CHECK-LABEL: unsigned_i16: 83 ; BWOFF: movw 84 ; BWON: movzwl 85 ; CHECK-NEXT: addw 86 ; CHECK-NEXT: ret 87 88 ; Except on Darwin, for legacy reasons. 89 ; DARWIN-LABEL: unsigned_i16: 90 ; DARWIN-BWOFF: movw 91 ; DARWIN-BWON: movzwl 92 ; DARWIN-NEXT: addw 93 ; DARWIN-NEXT: movzwl 94 ; DARWIN-NEXT: ret 95 } 96 97 98 define i32 @use_i1() { 99 entry: 100 %0 = call i1 @unsigned_i1(); 101 %1 = zext i1 %0 to i32 102 ret i32 %1 103 104 ; The high 24 bits of %eax from a function returning i1 are undefined. 105 ; CHECK-LABEL: use_i1: 106 ; CHECK: call 107 ; CHECK-NEXT: movzbl 108 ; CHECK-NEXT: {{pop|add}} 109 ; CHECK-NEXT: ret 110 } 111 112 define i32 @use_i8() { 113 entry: 114 %0 = call i8 @unsigned_i8(); 115 %1 = zext i8 %0 to i32 116 ret i32 %1 117 118 ; The high 24 bits of %eax from a function returning i8 are undefined. 119 ; CHECK-LABEL: use_i8: 120 ; CHECK: call 121 ; CHECK-NEXT: movzbl 122 ; CHECK-NEXT: {{pop|add}} 123 ; CHECK-NEXT: ret 124 } 125 126 define i32 @use_i16() { 127 entry: 128 %0 = call i16 @unsigned_i16(); 129 %1 = zext i16 %0 to i32 130 ret i32 %1 131 132 ; The high 16 bits of %eax from a function returning i16 are undefined. 133 ; CHECK-LABEL: use_i16: 134 ; CHECK: call 135 ; CHECK-NEXT: movzwl 136 ; CHECK-NEXT: {{pop|add}} 137 ; CHECK-NEXT: ret 138 } 139