1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker%big = type i32 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker@var = global %big 0 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; AAPCS: low 8 bits of %in (== w0) will be either 0 or 1. Need to extend to 7*9880d681SAndroid Build Coastguard Worker; 32-bits. 8*9880d681SAndroid Build Coastguard Workerdefine void @consume_i1_arg(i1 %in) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: consume_i1_arg: 10*9880d681SAndroid Build Coastguard Worker; CHECK: and [[BOOL32:w[0-9]+]], w0, #{{0x1|0xff}} 11*9880d681SAndroid Build Coastguard Worker; CHECK: str [[BOOL32]], [{{x[0-9]+}}, :lo12:var] 12*9880d681SAndroid Build Coastguard Worker %val = zext i1 %in to %big 13*9880d681SAndroid Build Coastguard Worker store %big %val, %big* @var 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; AAPCS: low 8 bits of %val1 (== w0) will be either 0 or 1. Need to extend to 18*9880d681SAndroid Build Coastguard Worker; 32-bits (doesn't really matter if it's from 1 or 8 bits). 19*9880d681SAndroid Build Coastguard Workerdefine void @consume_i1_ret() { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: consume_i1_ret: 21*9880d681SAndroid Build Coastguard Worker; CHECK: bl produce_i1_ret 22*9880d681SAndroid Build Coastguard Worker; CHECK: and [[BOOL32:w[0-9]+]], w0, #{{0x1|0xff}} 23*9880d681SAndroid Build Coastguard Worker; CHECK: str [[BOOL32]], [{{x[0-9]+}}, :lo12:var] 24*9880d681SAndroid Build Coastguard Worker %val1 = call i1 @produce_i1_ret() 25*9880d681SAndroid Build Coastguard Worker %val = zext i1 %val1 to %big 26*9880d681SAndroid Build Coastguard Worker store %big %val, %big* @var 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; AAPCS: low 8 bits of w0 must be either 0 or 1. Need to mask them off. 31*9880d681SAndroid Build Coastguard Workerdefine i1 @produce_i1_ret() { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: produce_i1_ret: 33*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[VAR32:w[0-9]+]], [{{x[0-9]+}}, :lo12:var] 34*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, [[VAR32]], #{{0x1|0xff}} 35*9880d681SAndroid Build Coastguard Worker %val = load %big, %big* @var 36*9880d681SAndroid Build Coastguard Worker %val1 = trunc %big %val to i1 37*9880d681SAndroid Build Coastguard Worker ret i1 %val1 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine void @produce_i1_arg() { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: produce_i1_arg: 42*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[VAR32:w[0-9]+]], [{{x[0-9]+}}, :lo12:var] 43*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, [[VAR32]], #{{0x1|0xff}} 44*9880d681SAndroid Build Coastguard Worker; CHECK: bl consume_i1_arg 45*9880d681SAndroid Build Coastguard Worker %val = load %big, %big* @var 46*9880d681SAndroid Build Coastguard Worker %val1 = trunc %big %val to i1 47*9880d681SAndroid Build Coastguard Worker call void @consume_i1_arg(i1 %val1) 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker;define zeroext i1 @foo(i8 %in) { 53*9880d681SAndroid Build Coastguard Worker; %val = trunc i8 %in to i1 54*9880d681SAndroid Build Coastguard Worker; ret i1 %val 55*9880d681SAndroid Build Coastguard Worker;} 56