|  | ; RUN: llc -O2 -march=bpfel -mattr=+alu32 < %s | FileCheck %s | 
|  | ; | 
|  | ; int mov(int a) | 
|  | ; { | 
|  | ;   return a; | 
|  | ; } | 
|  | ; | 
|  | ; int mov_ri(void) | 
|  | ; { | 
|  | ;   return 0xff; | 
|  | ; } | 
|  | ; | 
|  | ; int add(int a, int b) | 
|  | ; { | 
|  | ;   return a + b; | 
|  | ; } | 
|  | ; | 
|  | ; int add_i(int a) | 
|  | ; { | 
|  | ;   return a + 0x7fffffff; | 
|  | ; } | 
|  | ; | 
|  | ; int sub(int a, int b) | 
|  | ; { | 
|  | ;   return a - b; | 
|  | ; } | 
|  | ; | 
|  | ; int sub_i(int a) | 
|  | ; { | 
|  | ;   return a - 0xffffffff; | 
|  | ; } | 
|  | ; | 
|  | ; int mul(int a, int b) | 
|  | ; { | 
|  | ;   return a * b; | 
|  | ; } | 
|  | ; | 
|  | ; int mul_i(int a) | 
|  | ; { | 
|  | ;   return a * 0xf; | 
|  | ; } | 
|  | ; | 
|  | ; unsigned div(unsigned a, unsigned b) | 
|  | ; { | 
|  | ;   return a / b; | 
|  | ; } | 
|  | ; | 
|  | ; unsigned div_i(unsigned a) | 
|  | ; { | 
|  | ;   return a / 0xf; | 
|  | ; } | 
|  | ; | 
|  | ; int or(int a, int b) | 
|  | ; { | 
|  | ;   return a | b; | 
|  | ; } | 
|  | ; | 
|  | ; int or_i(int a) | 
|  | ; { | 
|  | ;   return a | 0xff; | 
|  | ; } | 
|  | ; | 
|  | ; int xor(int a, int b) | 
|  | ; { | 
|  | ;   return a ^ b; | 
|  | ; } | 
|  | ; | 
|  | ; int xor_i(int a) | 
|  | ; { | 
|  | ;   return a ^ 0xfff; | 
|  | ; } | 
|  | ; | 
|  | ; int and(int a, int b) | 
|  | ; { | 
|  | ;   return a & b; | 
|  | ; } | 
|  | ; | 
|  | ; int and_i(int a) | 
|  | ; { | 
|  | ;   return a & 0xffff; | 
|  | ; } | 
|  | ; | 
|  | ; int sll(int a, int b) | 
|  | ; { | 
|  | ;   return a << b; | 
|  | ; } | 
|  | ; | 
|  | ; int sll_i(int a) | 
|  | ; { | 
|  | ;   return a << 17; | 
|  | ; } | 
|  | ; | 
|  | ; unsigned srl(unsigned a, unsigned b) | 
|  | ; { | 
|  | ;   return a >> b; | 
|  | ; } | 
|  | ; | 
|  | ; unsigned srl_i(unsigned a, unsigned b) | 
|  | ; { | 
|  | ;   return a >> 31; | 
|  | ; } | 
|  | ; | 
|  | ; int sra(int a, int b) | 
|  | ; { | 
|  | ;   return a >> b; | 
|  | ; } | 
|  | ; | 
|  | ; int sra_i(int a, int b) | 
|  | ; { | 
|  | ;   return a >> 7; | 
|  | ; } | 
|  | ; | 
|  | ; int neg(int a) | 
|  | ; { | 
|  | ;   return -a; | 
|  | ; } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @mov(i32 returned %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | ret i32 %a | 
|  | ; CHECK: w{{[0-9]+}} = w{{[0-9]+}} | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @mov_ri() local_unnamed_addr #0 { | 
|  | entry: | 
|  | ret i32 255 | 
|  | ; CHECK: w{{[0-9]+}} = 255 | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @add(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %add = add nsw i32 %b, %a | 
|  | ; CHECK: w{{[0-9]+}} += w{{[0-9]+}} | 
|  | ret i32 %add | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @add_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %add = add nsw i32 %a, 2147483647 | 
|  | ; CHECK: w{{[0-9]+}} += 2147483647 | 
|  | ret i32 %add | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sub(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %sub = sub nsw i32 %a, %b | 
|  | ; CHECK: w{{[0-9]+}} -= w{{[0-9]+}} | 
|  | ret i32 %sub | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sub_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %sub = add i32 %a, 1 | 
|  | ; CHECK: w{{[0-9]+}} += 1 | 
|  | ret i32 %sub | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @mul(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %mul = mul nsw i32 %b, %a | 
|  | ; CHECK: w{{[0-9]+}} *= w{{[0-9]+}} | 
|  | ret i32 %mul | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @mul_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %mul = mul nsw i32 %a, 15 | 
|  | ; CHECK: w{{[0-9]+}} *= 15 | 
|  | ret i32 %mul | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @div(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %div = udiv i32 %a, %b | 
|  | ; CHECK: w{{[0-9]+}} /= w{{[0-9]+}} | 
|  | ret i32 %div | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @div_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %div = udiv i32 %a, 15 | 
|  | ; CHECK: w{{[0-9]+}} /= 15 | 
|  | ret i32 %div | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @or(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %or = or i32 %b, %a | 
|  | ; CHECK: w{{[0-9]+}} |= w{{[0-9]+}} | 
|  | ret i32 %or | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @or_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %or = or i32 %a, 255 | 
|  | ; CHECK: w{{[0-9]+}} |= 255 | 
|  | ret i32 %or | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @xor(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %xor = xor i32 %b, %a | 
|  | ; CHECK: w{{[0-9]+}} ^= w{{[0-9]+}} | 
|  | ret i32 %xor | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @xor_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %xor = xor i32 %a, 4095 | 
|  | ; CHECK: w{{[0-9]+}} ^= 4095 | 
|  | ret i32 %xor | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @and(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %and = and i32 %b, %a | 
|  | ; CHECK: w{{[0-9]+}} &= w{{[0-9]+}} | 
|  | ret i32 %and | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @and_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %and = and i32 %a, 65535 | 
|  | ; CHECK: w{{[0-9]+}} &= 65535 | 
|  | ret i32 %and | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sll(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shl = shl i32 %a, %b | 
|  | ; CHECK: w{{[0-9]+}} <<= w{{[0-9]+}} | 
|  | ret i32 %shl | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sll_i(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shl = shl i32 %a, 17 | 
|  | ; CHECK: w{{[0-9]+}} <<= 17 | 
|  | ret i32 %shl | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @srl(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shr = lshr i32 %a, %b | 
|  | ; CHECK: w{{[0-9]+}} >>= w{{[0-9]+}} | 
|  | ret i32 %shr | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @srl_i(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shr = lshr i32 %a, 31 | 
|  | ; CHECK: w{{[0-9]+}} >>= 31 | 
|  | ret i32 %shr | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sra(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shr = ashr i32 %a, %b | 
|  | ; CHECK: w{{[0-9]+}} s>>= w{{[0-9]+}} | 
|  | ret i32 %shr | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @sra_i(i32 %a, i32 %b) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %shr = ashr i32 %a, 7 | 
|  | ; CHECK: w{{[0-9]+}} s>>= 7 | 
|  | ret i32 %shr | 
|  | } | 
|  |  | 
|  | ; Function Attrs: norecurse nounwind readnone | 
|  | define dso_local i32 @neg(i32 %a) local_unnamed_addr #0 { | 
|  | entry: | 
|  | %sub = sub nsw i32 0, %a | 
|  | ; CHECK: w{{[0-9]+}} = -w{{[0-9]+}} | 
|  | ret i32 %sub | 
|  | } |