1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=v7 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -mtriple=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s --check-prefix=v7 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=v7 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Can't test pre-ARMv6 Thumb because ARM FastISel currently only supports 6*9880d681SAndroid Build Coastguard Worker; Thumb2. The ARMFastISel::ARMEmitIntExt code should work for Thumb by always 7*9880d681SAndroid Build Coastguard Worker; using two shifts. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Note that lsl, asr and lsr in Thumb are all encoded as 16-bit instructions 10*9880d681SAndroid Build Coastguard Worker; and therefore must set flags. {{s?}} below denotes this, instead of 11*9880d681SAndroid Build Coastguard Worker; duplicating tests. 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; zext 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i8 @zext_1_8(i1 %a) nounwind ssp { 16*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_1_8: 17*9880d681SAndroid Build Coastguard Worker; v7: and r0, r0, #1 18*9880d681SAndroid Build Coastguard Worker %r = zext i1 %a to i8 19*9880d681SAndroid Build Coastguard Worker ret i8 %r 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i16 @zext_1_16(i1 %a) nounwind ssp { 23*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_1_16: 24*9880d681SAndroid Build Coastguard Worker; v7: and r0, r0, #1 25*9880d681SAndroid Build Coastguard Worker %r = zext i1 %a to i16 26*9880d681SAndroid Build Coastguard Worker ret i16 %r 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @zext_1_32(i1 %a) nounwind ssp { 30*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_1_32: 31*9880d681SAndroid Build Coastguard Worker; v7: and r0, r0, #1 32*9880d681SAndroid Build Coastguard Worker %r = zext i1 %a to i32 33*9880d681SAndroid Build Coastguard Worker ret i32 %r 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i16 @zext_8_16(i8 %a) nounwind ssp { 37*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_8_16: 38*9880d681SAndroid Build Coastguard Worker; v7: and r0, r0, #255 39*9880d681SAndroid Build Coastguard Worker %r = zext i8 %a to i16 40*9880d681SAndroid Build Coastguard Worker ret i16 %r 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine i32 @zext_8_32(i8 %a) nounwind ssp { 44*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_8_32: 45*9880d681SAndroid Build Coastguard Worker; v7: and r0, r0, #255 46*9880d681SAndroid Build Coastguard Worker %r = zext i8 %a to i32 47*9880d681SAndroid Build Coastguard Worker ret i32 %r 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @zext_16_32(i16 %a) nounwind ssp { 51*9880d681SAndroid Build Coastguard Worker; v7-LABEL: zext_16_32: 52*9880d681SAndroid Build Coastguard Worker; v7: uxth r0, r0 53*9880d681SAndroid Build Coastguard Worker %r = zext i16 %a to i32 54*9880d681SAndroid Build Coastguard Worker ret i32 %r 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; sext 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i8 @sext_1_8(i1 %a) nounwind ssp { 60*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_1_8: 61*9880d681SAndroid Build Coastguard Worker; v7: lsl{{s?}} r0, r0, #31 62*9880d681SAndroid Build Coastguard Worker; v7: asr{{s?}} r0, r0, #31 63*9880d681SAndroid Build Coastguard Worker %r = sext i1 %a to i8 64*9880d681SAndroid Build Coastguard Worker ret i8 %r 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine i16 @sext_1_16(i1 %a) nounwind ssp { 68*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_1_16: 69*9880d681SAndroid Build Coastguard Worker; v7: lsl{{s?}} r0, r0, #31 70*9880d681SAndroid Build Coastguard Worker; v7: asr{{s?}} r0, r0, #31 71*9880d681SAndroid Build Coastguard Worker %r = sext i1 %a to i16 72*9880d681SAndroid Build Coastguard Worker ret i16 %r 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i32 @sext_1_32(i1 %a) nounwind ssp { 76*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_1_32: 77*9880d681SAndroid Build Coastguard Worker; v7: lsl{{s?}} r0, r0, #31 78*9880d681SAndroid Build Coastguard Worker; v7: asr{{s?}} r0, r0, #31 79*9880d681SAndroid Build Coastguard Worker %r = sext i1 %a to i32 80*9880d681SAndroid Build Coastguard Worker ret i32 %r 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine i16 @sext_8_16(i8 %a) nounwind ssp { 84*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_8_16: 85*9880d681SAndroid Build Coastguard Worker; v7: sxtb r0, r0 86*9880d681SAndroid Build Coastguard Worker %r = sext i8 %a to i16 87*9880d681SAndroid Build Coastguard Worker ret i16 %r 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i32 @sext_8_32(i8 %a) nounwind ssp { 91*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_8_32: 92*9880d681SAndroid Build Coastguard Worker; v7: sxtb r0, r0 93*9880d681SAndroid Build Coastguard Worker %r = sext i8 %a to i32 94*9880d681SAndroid Build Coastguard Worker ret i32 %r 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine i32 @sext_16_32(i16 %a) nounwind ssp { 98*9880d681SAndroid Build Coastguard Worker; v7-LABEL: sext_16_32: 99*9880d681SAndroid Build Coastguard Worker; v7: sxth r0, r0 100*9880d681SAndroid Build Coastguard Worker %r = sext i16 %a to i32 101*9880d681SAndroid Build Coastguard Worker ret i32 %r 102*9880d681SAndroid Build Coastguard Worker} 103