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