326 lines · plain
1//RUN: llvm-mc -triple=aarch64-linux-gnu -print-imm-hex %s | FileCheck %s2 3//4// Check that large constants are converted to ldr from constant pool5//6// simple test7.section a, "ax", @progbits8// CHECK-LABEL: f1:9f1:10 ldr x0, =0x123411// CHECK: mov x0, #0x123412 ldr w1, =0x456713// CHECK: mov w1, #0x456714 ldr x0, =0x1234000015// CHECK: mov x0, #0x1234000016 ldr w1, =0x4567000017// CHECK: mov w1, #0x4567000018 ldr x0, =0xabc0000000019// CHECK: mov x0, #0xabc0000000020 ldr x0, =0xbeef00000000000021// CHECK: mov x0, #-0x411100000000000022 23.section b,"ax",@progbits24// CHECK-LABEL: f3:25f3:26 ldr w0, =0x1000127// CHECK: ldr w0, .Ltmp[[TMP0:[0-9]+]]28 29// loading multiple constants30.section c,"ax",@progbits31// CHECK-LABEL: f4:32f4:33 ldr w0, =0x1000234// CHECK: ldr w0, .Ltmp[[TMP1:[0-9]+]]35 adds x0, x0, #136 adds x0, x0, #137 adds x0, x0, #138 adds x0, x0, #139 ldr w0, =0x1000340// CHECK: ldr w0, .Ltmp[[TMP2:[0-9]+]]41 adds x0, x0, #142 adds x0, x0, #143 44// TODO: the same constants should have the same constant pool location45.section d,"ax",@progbits46// CHECK-LABEL: f5:47f5:48 ldr w0, =0x1000449// CHECK: ldr w0, .Ltmp[[TMP3:[0-9]+]]50 adds x0, x0, #151 adds x0, x0, #152 adds x0, x0, #153 adds x0, x0, #154 adds x0, x0, #155 adds x0, x0, #156 adds x0, x0, #157 ldr w0, =0x1000458// CHECK: ldr w0, .Ltmp[[TMP3:[0-9]+]]59 adds x0, x0, #160 adds x0, x0, #161 adds x0, x0, #162 adds x0, x0, #163 adds x0, x0, #164 adds x0, x0, #165 66// a section defined in multiple pieces should be merged and use a single constant pool67.section e,"ax",@progbits68// CHECK-LABEL: f6:69f6:70 ldr w0, =0x1000671// CHECK: ldr w0, .Ltmp[[TMP5:[0-9]+]]72 adds x0, x0, #173 adds x0, x0, #174 adds x0, x0, #175 76.section f, "ax", @progbits77// CHECK-LABEL: f7:78f7:79 adds x0, x0, #180 adds x0, x0, #181 adds x0, x0, #182 83.section e, "ax", @progbits84// CHECK-LABEL: f8:85f8:86 adds x0, x0, #187 ldr w0, =0x1000788// CHECK: ldr w0, .Ltmp[[TMP6:[0-9]+]]89 adds x0, x0, #190 adds x0, x0, #191 92//93// Check that symbols can be loaded using ldr pseudo94//95 96// load an undefined symbol97.section g,"ax",@progbits98// CHECK-LABEL: f9:99f9:100 ldr w0, =foo101// CHECK: ldr w0, .Ltmp[[TMP7:[0-9]+]]102 103// load a symbol from another section104.section h,"ax",@progbits105// CHECK-LABEL: f10:106f10:107 ldr w0, =f5108// CHECK: ldr w0, .Ltmp[[TMP8:[0-9]+]]109 110// load a symbol from the same section111.section i,"ax",@progbits112// CHECK-LABEL: f11:113f11:114 ldr w0, =f12115// CHECK: ldr w0, .Ltmp[[TMP9:[0-9]+]]116 ldr w0,=0x3C000117// CHECK: ldr w0, .Ltmp[[TMP10:[0-9]+]]118 119// CHECK-LABEL: f12:120f12:121 adds x0, x0, #1122 adds x0, x0, #1123 124.section j,"ax",@progbits125// mix of symbols and constants126// CHECK-LABEL: f13:127f13:128 adds x0, x0, #1129 adds x0, x0, #1130 ldr w0, =0x101131// CHECK: mov w0, #0x101132 adds x0, x0, #1133 adds x0, x0, #1134 ldr w0, =bar135// CHECK: ldr w0, .Ltmp[[TMP11:[0-9]+]]136 adds x0, x0, #1137 adds x0, x0, #1138//139// Check for correct usage in other contexts140//141 142// usage in macro143.macro useit_in_a_macro144 ldr w0, =0x10008145 ldr w0, =baz146.endm147.section k,"ax",@progbits148// CHECK-LABEL: f14:149f14:150 useit_in_a_macro151// CHECK: ldr w0, .Ltmp[[TMP12:[0-9]+]]152// CHECK: ldr w0, .Ltmp[[TMP13:[0-9]+]]153 154// usage with expressions155.section l, "ax", @progbits156// CHECK-LABEL: f15:157f15:158 ldr w0, =0x10001+8159// CHECK: ldr w0, .Ltmp[[TMP14:[0-9]+]]160 adds x0, x0, #1161 ldr w0, =bar+4162// CHECK: ldr w0, .Ltmp[[TMP15:[0-9]+]]163 adds x0, x0, #1164 165// usage with 64-bit regs166.section m, "ax", @progbits167// CHECK-LABEL: f16:168f16:169 ldr x0, =0x0102030405060708170// CHECK: ldr x0, .Ltmp[[TMP16:[0-9]+]]171 add x0, x0, #1172 ldr w0, =bar173// CHECK: ldr w0, .Ltmp[[TMP17:[0-9]+]]174 ldr x0, =bar+16175// CHECK: ldr x0, .Ltmp[[TMP18:[0-9]+]]176 add x0, x0, #1177 ldr x0, =0x100000001178// CHECK: ldr x0, .Ltmp[[TMP19:[0-9]+]]179 ldr x1, =-0x80000001180// CHECK: ldr x1, .Ltmp[[TMP20:[0-9]+]]181 ldr x2, =0x10001182// CHECK: ldr x2, .Ltmp[[TMP21:[0-9]+]]183 184// check range for 32-bit regs185.section n, "ax", @progbits186// CHECK-LABEL: f17:187f17:188 ldr w0, =0xFFFFFFFF189// CHECK: ldr w0, .Ltmp[[TMP22:[0-9]+]]190 add w0, w0, #1191 ldr w1, =-0x7FFFFFFF192// CHECK: ldr w1, .Ltmp[[TMP23:[0-9]+]]193 add w0, w0, #1194 ldr w0, =-1195// CHECK: ldr w0, .Ltmp[[TMP24:[0-9]+]]196 add w0, w0, #1197 198// make sure the same contant uses different pools for 32- and 64-bit registers199.section o, "ax", @progbits200// CHECK-LABEL: f18:201f18:202 ldr w0, =0x320064203// CHECK: ldr w0, .Ltmp[[TMP25:[0-9]+]]204 add w0, w0, #1205 ldr x1, =0x320064206// CHECK: ldr x1, .Ltmp[[TMP26:[0-9]+]]207 208// We previously used a DenseMap with constant values as keys, check that209// sentinel values can be used.210 ldr x0, =0x7ffffffffffffffe211// CHECK: ldr x0, .Ltmp[[TMP27:[0-9]+]]212 ldr x1, =0x7fffffffffffffff213// CHECK: ldr x1, .Ltmp[[TMP28:[0-9]+]]214 215//216// Constant Pools217//218// CHECK: .section b,"ax",@progbits219// CHECK: .p2align 2220// CHECK: .Ltmp[[TMP0]]221// CHECK: .word 65537222 223// CHECK: .section c,"ax",@progbits224// CHECK: .p2align 2225// CHECK: .Ltmp[[TMP1]]226// CHECK: .word 65538227// CHECK: .p2align 2228// CHECK: .Ltmp[[TMP2]]229// CHECK: .word 65539230 231// CHECK: .section d,"ax",@progbits232// CHECK: .p2align 2233// CHECK: .Ltmp[[TMP3]]234// CHECK: .word 65540235 236// CHECK: .section e,"ax",@progbits237// CHECK: .p2align 2238// CHECK: .Ltmp[[TMP5]]239// CHECK: .word 65542240// CHECK: .p2align 2241// CHECK: .Ltmp[[TMP6]]242// CHECK: .word 65543243 244// Should not switch to section because it has no constant pool245// CHECK-NOT: .section f,"ax",@progbits246 247// CHECK: .section g,"ax",@progbits248// CHECK: .p2align 2249// CHECK: .Ltmp[[TMP7]]250// CHECK: .word foo251 252// CHECK: .section h,"ax",@progbits253// CHECK: .p2align 2254// CHECK: .Ltmp[[TMP8]]255// CHECK: .word f5256 257// CHECK: .section i,"ax",@progbits258// CHECK: .p2align 2259// CHECK: .Ltmp[[TMP9]]260// CHECK: .word f12261// CHECK: .p2align 2262// CHECK: .Ltmp[[TMP10]]263// CHECK: .word 245760264 265// CHECK: .section j,"ax",@progbits266// CHECK: .p2align 2267// CHECK: .Ltmp[[TMP11]]268// CHECK: .word bar269 270// CHECK: .section k,"ax",@progbits271// CHECK: .p2align 2272// CHECK: .Ltmp[[TMP12]]273// CHECK: .word 65544274// CHECK: .p2align 2275// CHECK: .Ltmp[[TMP13]]276// CHECK: .word baz277 278// CHECK: .section l,"ax",@progbits279// CHECK: .p2align 2280// CHECK: .Ltmp[[TMP14]]281// CHECK: .word 65545282// CHECK: .p2align 2283// CHECK: .Ltmp[[TMP15]]284// CHECK: .word bar+4285 286// CHECK: .section m,"ax",@progbits287// CHECK: .p2align 3288// CHECK: .Ltmp[[TMP16]]289// CHECK: .xword 72623859790382856290// CHECK: .p2align 2291// CHECK: .Ltmp[[TMP17]]292// CHECK: .word bar293// CHECK: .p2align 3294// CHECK: .Ltmp[[TMP18]]295// CHECK: .xword bar+16296// CHECK: .p2align 3297// CHECK: .Ltmp[[TMP19]]298// CHECK: .xword 4294967297299// CHECK: .p2align 3300// CHECK: .Ltmp[[TMP20]]301// CHECK: .xword -2147483649302// CHECK: .p2align 3303// CHECK: .Ltmp[[TMP21]]304// CHECK: .xword 65537305 306// CHECK: .section n,"ax",@progbits307// CHECK: .p2align 2308// CHECK: .Ltmp[[TMP22]]309// CHECK: .word 4294967295310// CHECK: .p2align 2311// CHECK: .Ltmp[[TMP23]]312// CHECK: .word -2147483647313// CHECK: .p2align 2314// CHECK: .Ltmp[[TMP24]]315// CHECK: .word -1316 317// CHECK: .section o,"ax",@progbits318// CHECK: .p2align 2319// CHECK: .Ltmp[[TMP25]]320// CHECK: .word 3276900321 322// CHECK: .Ltmp[[TMP27]]323// CHECK: .xword 9223372036854775806324// CHECK: .Ltmp[[TMP28]]325// CHECK: .xword 9223372036854775807326