1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-linux-gnu | FileCheck %s 2 3 ; Note that this should be refactored (for efficiency if nothing else) 4 ; when the PCS is implemented so we don't have to worry about the 5 ; loads and stores. 6 7 @var_i32 = global i32 42 8 @var_i64 = global i64 0 9 10 ; Add pure 12-bit immediates: 11 define void @add_small() { 12 ; CHECK-LABEL: add_small: 13 14 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #4095 15 %val32 = load i32* @var_i32 16 %newval32 = add i32 %val32, 4095 17 store i32 %newval32, i32* @var_i32 18 19 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #52 20 %val64 = load i64* @var_i64 21 %newval64 = add i64 %val64, 52 22 store i64 %newval64, i64* @var_i64 23 24 ret void 25 } 26 27 ; Add 12-bit immediates, shifted left by 12 bits 28 define void @add_med() { 29 ; CHECK-LABEL: add_med: 30 31 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{#3567, lsl #12|#14610432}} 32 %val32 = load i32* @var_i32 33 %newval32 = add i32 %val32, 14610432 ; =0xdef000 34 store i32 %newval32, i32* @var_i32 35 36 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{#4095, lsl #12|#16773120}} 37 %val64 = load i64* @var_i64 38 %newval64 = add i64 %val64, 16773120 ; =0xfff000 39 store i64 %newval64, i64* @var_i64 40 41 ret void 42 } 43 44 ; Subtract 12-bit immediates 45 define void @sub_small() { 46 ; CHECK-LABEL: sub_small: 47 48 ; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, #4095 49 %val32 = load i32* @var_i32 50 %newval32 = sub i32 %val32, 4095 51 store i32 %newval32, i32* @var_i32 52 53 ; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, #52 54 %val64 = load i64* @var_i64 55 %newval64 = sub i64 %val64, 52 56 store i64 %newval64, i64* @var_i64 57 58 ret void 59 } 60 61 ; Subtract 12-bit immediates, shifted left by 12 bits 62 define void @sub_med() { 63 ; CHECK-LABEL: sub_med: 64 65 ; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{#3567, lsl #12|#14610432}} 66 %val32 = load i32* @var_i32 67 %newval32 = sub i32 %val32, 14610432 ; =0xdef000 68 store i32 %newval32, i32* @var_i32 69 70 ; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{#4095, lsl #12|#16773120}} 71 %val64 = load i64* @var_i64 72 %newval64 = sub i64 %val64, 16773120 ; =0xfff000 73 store i64 %newval64, i64* @var_i64 74 75 ret void 76 } 77 78 define void @testing() { 79 ; CHECK-LABEL: testing: 80 %val = load i32* @var_i32 81 82 ; CHECK: cmp {{w[0-9]+}}, #4095 83 ; CHECK: b.ne [[RET:.?LBB[0-9]+_[0-9]+]] 84 %cmp_pos_small = icmp ne i32 %val, 4095 85 br i1 %cmp_pos_small, label %ret, label %test2 86 87 test2: 88 ; CHECK: cmp {{w[0-9]+}}, {{#3567, lsl #12|#14610432}} 89 ; CHECK: b.lo [[RET]] 90 %newval2 = add i32 %val, 1 91 store i32 %newval2, i32* @var_i32 92 %cmp_pos_big = icmp ult i32 %val, 14610432 93 br i1 %cmp_pos_big, label %ret, label %test3 94 95 test3: 96 ; CHECK: cmp {{w[0-9]+}}, #123 97 ; CHECK: b.lt [[RET]] 98 %newval3 = add i32 %val, 2 99 store i32 %newval3, i32* @var_i32 100 %cmp_pos_slt = icmp slt i32 %val, 123 101 br i1 %cmp_pos_slt, label %ret, label %test4 102 103 test4: 104 ; CHECK: cmp {{w[0-9]+}}, #321 105 ; CHECK: b.gt [[RET]] 106 %newval4 = add i32 %val, 3 107 store i32 %newval4, i32* @var_i32 108 %cmp_pos_sgt = icmp sgt i32 %val, 321 109 br i1 %cmp_pos_sgt, label %ret, label %test5 110 111 test5: 112 ; CHECK: cmn {{w[0-9]+}}, #444 113 ; CHECK: b.gt [[RET]] 114 %newval5 = add i32 %val, 4 115 store i32 %newval5, i32* @var_i32 116 %cmp_neg_uge = icmp sgt i32 %val, -444 117 br i1 %cmp_neg_uge, label %ret, label %test6 118 119 test6: 120 %newval6 = add i32 %val, 5 121 store i32 %newval6, i32* @var_i32 122 ret void 123 124 ret: 125 ret void 126 } 127 ; TODO: adds/subs 128