1; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s 2; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -code-model=large | FileCheck --check-prefix=CHECK-LARGE %s 3 4@var32 = global i32 0 5@var64 = global i64 0 6 7define void @foo() { 8; CHECK-LABEL: foo: 9 %val32 = load i32* @var32 10 %val64 = load i64* @var64 11 12 %val32_lit32 = and i32 %val32, 123456785 13 store volatile i32 %val32_lit32, i32* @var32 14; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] 15; CHECK: ldr {{w[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 16 17; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI0_[0-9]+]] 18; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 19; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 20; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 21; CHECK-LARGE: ldr {{w[0-9]+}}, [x[[LITADDR]]] 22 23 %val64_lit32 = and i64 %val64, 305402420 24 store volatile i64 %val64_lit32, i64* @var64 25; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] 26; CHECK: ldr {{w[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 27 28; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI0_[0-9]+]] 29; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 30; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 31; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 32; CHECK-LARGE: ldr {{w[0-9]+}}, [x[[LITADDR]]] 33 34 %val64_lit32signed = and i64 %val64, -12345678 35 store volatile i64 %val64_lit32signed, i64* @var64 36; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] 37; CHECK: ldrsw {{x[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 38 39; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI0_[0-9]+]] 40; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 41; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 42; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 43; CHECK-LARGE: ldrsw {{x[0-9]+}}, [x[[LITADDR]]] 44 45 %val64_lit64 = and i64 %val64, 1234567898765432 46 store volatile i64 %val64_lit64, i64* @var64 47; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] 48; CHECK: ldr {{x[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 49 50; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI0_[0-9]+]] 51; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 52; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 53; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 54; CHECK-LARGE: ldr {{x[0-9]+}}, [x[[LITADDR]]] 55 56 ret void 57} 58 59@varfloat = global float 0.0 60@vardouble = global double 0.0 61 62define void @floating_lits() { 63; CHECK-LABEL: floating_lits: 64 65 %floatval = load float* @varfloat 66 %newfloat = fadd float %floatval, 128.0 67; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI1_[0-9]+]] 68; CHECK: ldr {{s[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 69; CHECK: fadd 70 71; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI1_[0-9]+]] 72; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 73; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 74; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 75; CHECK-LARGE: ldr {{s[0-9]+}}, [x[[LITADDR]]] 76; CHECK-LARGE: fadd 77 78 store float %newfloat, float* @varfloat 79 80 %doubleval = load double* @vardouble 81 %newdouble = fadd double %doubleval, 129.0 82; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI1_[0-9]+]] 83; CHECK: ldr {{d[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] 84; CHECK: fadd 85 86; CHECK-LARGE: movz x[[LITADDR:[0-9]+]], #:abs_g3:[[CURLIT:.LCPI1_[0-9]+]] 87; CHECK-LARGE: movk x[[LITADDR]], #:abs_g2_nc:[[CURLIT]] 88; CHECK-LARGE: movk x[[LITADDR]], #:abs_g1_nc:[[CURLIT]] 89; CHECK-LARGE: movk x[[LITADDR]], #:abs_g0_nc:[[CURLIT]] 90; CHECK-LARGE: ldr {{d[0-9]+}}, [x[[LITADDR]]] 91 92 store double %newdouble, double* @vardouble 93 94 ret void 95} 96