llvm/llvm/test/CodeGen/X86/return-ext.ll

; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=0 | \
; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s
; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \
; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWON %s
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -fixup-byte-word-insts=0 | \
; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s
; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \
; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWON %s
; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=0 | \
; RUN:   FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWOFF %s
; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=1 | \
; RUN:   FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWON %s


@x = common global i32 0, align 4

define zeroext i1 @unsigned_i1() {
entry:
  %0 = load i32, ptr @x
  %cmp = icmp eq i32 %0, 42
  ret i1 %cmp

; Unsigned i1 return values are not extended.
; CHECK-LABEL: unsigned_i1:
; CHECK:			 cmp
; CHECK-NEXT:  sete
; CHECK-NEXT:  ret
}

define zeroext i8 @unsigned_i8() {
entry:
  %0 = load i32, ptr @x
  %cmp = icmp eq i32 %0, 42
  %retval = zext i1 %cmp to i8
  ret i8 %retval

; Unsigned i8 return values are not extended.
; CHECK-LABEL: unsigned_i8:
; CHECK:			 cmp
; CHECK-NEXT:  sete
; CHECK-NEXT:  ret

; Except on Darwin, for legacy reasons.
; DARWIN-LABEL: unsigned_i8:
; DARWIN:       xorl
; DARWIN-NEXT:  cmp
; DARWIN-NEXT:  sete
; DARWIN-NEXT:  ret
}

define signext i8 @signed_i8() {
entry:
  %0 = load i32, ptr @x
  %cmp = icmp eq i32 %0, 42
  %retval = zext i1 %cmp to i8
  ret i8 %retval

; Signed i8 return values are not extended.
; CHECK-LABEL: signed_i8:
; CHECK:			 cmp
; CHECK-NEXT:  sete
; CHECK-NEXT:  ret

; Except on Darwin, for legacy reasons.
; DARWIN-LABEL: signed_i8:
; DARWIN:       xorl
; DARWIN-NEXT:  cmp
; DARWIN-NEXT:  sete
; DARWIN-NEXT:  ret
}

@a = common global i16 0
@b = common global i16 0
define zeroext i16 @unsigned_i16() {
entry:
  %0 = load i16, ptr @a
  %1 = load i16, ptr @b
  %add = add i16 %1, %0
  ret i16 %add

; i16 return values are not extended.
; CHECK-LABEL: unsigned_i16:
; BWOFF:       movw
; BWON:        movzwl
; CHECK-NEXT:  addw
; CHECK-NEXT:  ret

; Except on Darwin, for legacy reasons.
; DARWIN-LABEL: unsigned_i16:
; DARWIN-BWOFF: movw
; DARWIN-BWON:  movzwl
; DARWIN-NEXT:  addw
; DARWIN-NEXT:  movzwl
; DARWIN-NEXT:  ret
}


define i32 @use_i1() {
entry:
  %0 = call i1 @unsigned_i1();
  %1 = zext i1 %0 to i32
  ret i32 %1

; The high 24 bits of %eax from a function returning i1 are undefined.
; CHECK-LABEL: use_i1:
; CHECK: call
; CHECK-NEXT: movzbl
; CHECK-NEXT: {{pop|add}}
; CHECK-NEXT: .cfi_def_cfa_offset {{4|8}}
; CHECK-NEXT: ret
}

define i32 @use_i8() {
entry:
  %0 = call i8 @unsigned_i8();
  %1 = zext i8 %0 to i32
  ret i32 %1

; The high 24 bits of %eax from a function returning i8 are undefined.
; CHECK-LABEL: use_i8:
; CHECK: call
; CHECK-NEXT: movzbl
; CHECK-NEXT: {{pop|add}}
; CHECK-NEXT: .cfi_def_cfa_offset {{4|8}}
; CHECK-NEXT: ret
}

define i32 @use_i16() {
entry:
  %0 = call i16 @unsigned_i16();
  %1 = zext i16 %0 to i32
  ret i32 %1

; The high 16 bits of %eax from a function returning i16 are undefined.
; CHECK-LABEL: use_i16:
; CHECK: call
; CHECK-NEXT: movzwl
; CHECK-NEXT: {{pop|add}}
; CHECK-NEXT: .cfi_def_cfa_offset {{4|8}}
; CHECK-NEXT: ret
}