blob: ffa87d43481ddd999c37f4b9815caedaf0f52e76 [file] [edit]
; RUN: llc < %s -mtriple=bpfel -mcpu=v4 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=bpfeb -mcpu=v4 -verify-machineinstrs | FileCheck %s
; A load from a constant global is replaced by the constant. On v4 the
; load may be a sign-extending one (LDSX), and the constant must be
; sign-extended as well.
%struct.S = type { i8, i8, i16, i32 }
@g = internal constant %struct.S { i8 -1, i8 127, i16 -3, i32 -4 }, align 4
define i64 @sext_i8_i64() {
%v = load i8, ptr @g, align 4
%s = sext i8 %v to i64
ret i64 %s
}
; CHECK-LABEL: sext_i8_i64:
; CHECK: r0 = -1
; CHECK-NEXT: exit
define i32 @sext_i8_i32() {
%v = load i8, ptr @g, align 4
%s = sext i8 %v to i32
ret i32 %s
}
; CHECK-LABEL: sext_i8_i32:
; CHECK: w0 = -1
; CHECK-NEXT: exit
define i64 @sext_i8_i64_pos() {
%p = getelementptr inbounds i8, ptr @g, i64 1
%v = load i8, ptr %p, align 1
%s = sext i8 %v to i64
ret i64 %s
}
; CHECK-LABEL: sext_i8_i64_pos:
; CHECK: r0 = 127
; CHECK-NEXT: exit
define i64 @sext_i16_i64() {
%p = getelementptr inbounds i8, ptr @g, i64 2
%v = load i16, ptr %p, align 2
%s = sext i16 %v to i64
ret i64 %s
}
; CHECK-LABEL: sext_i16_i64:
; CHECK: r0 = -3
; CHECK-NEXT: exit
define i32 @sext_i16_i32() {
%p = getelementptr inbounds i8, ptr @g, i64 2
%v = load i16, ptr %p, align 2
%s = sext i16 %v to i32
ret i32 %s
}
; CHECK-LABEL: sext_i16_i32:
; CHECK: w0 = -3
; CHECK-NEXT: exit
define i64 @sext_i32_i64() {
%p = getelementptr inbounds i8, ptr @g, i64 4
%v = load i32, ptr %p, align 4
%s = sext i32 %v to i64
ret i64 %s
}
; CHECK-LABEL: sext_i32_i64:
; CHECK: r0 = -4
; CHECK-NEXT: exit
define i64 @zext_i8_i64() {
%v = load i8, ptr @g, align 4
%s = zext i8 %v to i64
ret i64 %s
}
; CHECK-LABEL: zext_i8_i64:
; CHECK: r0 = 255
; CHECK-NEXT: exit