1 ; Show that we handle constants in movw and mvt, when it isn't represented as 2 ; ConstantRelocatable (see mov-imm.ll for the ConstantRelocatable case). 3 4 ; REQUIRES: allow_dump 5 6 ; Compile using standalone assembler. 7 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -Om1 \ 8 ; RUN: --test-stack-extra 4084 | FileCheck %s --check-prefix=ASM 9 10 ; Show bytes in assembled standalone code. 11 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \ 12 ; RUN: --args -Om1 --test-stack-extra 4084 | FileCheck %s --check-prefix=DIS 13 14 ; Compile using integrated assembler. 15 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -Om1 \ 16 ; RUN: --test-stack-extra 4084 | FileCheck %s --check-prefix=IASM 17 18 ; Show bytes in assembled integrated code. 19 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \ 20 ; RUN: --args -Om1 --test-stack-extra 4084 \ 21 ; RUN: | FileCheck %s --check-prefix=DIS 22 23 define internal i32 @foo(i32 %x) { 24 entry: 25 26 ; ASM-LABEL: foo: 27 ; DIS-LABEL: 00000000 <foo>: 28 ; IASM-LABEL: foo: 29 30 ; ASM-NEXT: .Lfoo$entry: 31 ; IASM-NEXT: .Lfoo$entry: 32 33 ; ASM-NEXT: movw ip, #4092 34 ; DIS-NEXT: 0: e300cffc 35 ; IASM-NEXT: .byte 0xfc 36 ; IASM-NEXT: .byte 0xcf 37 ; IASM-NEXT: .byte 0x0 38 ; IASM-NEXT: .byte 0xe3 39 40 ; ASM-NEXT: sub sp, sp, ip 41 ; DIS-NEXT: 4: e04dd00c 42 ; IASM-NEXT: .byte 0xc 43 ; IASM-NEXT: .byte 0xd0 44 ; IASM-NEXT: .byte 0x4d 45 ; IASM-NEXT: .byte 0xe0 46 47 ; ASM-NEXT: str r0, [sp, #4088] 48 ; DIS-NEXT: 8: e58d0ff8 49 ; IASM-NEXT: .byte 0xf8 50 ; IASM-NEXT: .byte 0xf 51 ; IASM-NEXT: .byte 0x8d 52 ; IASM-NEXT: .byte 0xe5 53 54 ; ASM-NEXT: # [sp, #4088] = def.pseudo 55 56 %mul = mul i32 %x, %x 57 58 ; ASM-NEXT: ldr r0, [sp, #4088] 59 ; DIS-NEXT: c: e59d0ff8 60 ; IASM-NEXT: .byte 0xf8 61 ; IASM-NEXT: .byte 0xf 62 ; IASM-NEXT: .byte 0x9d 63 ; IASM-NEXT: .byte 0xe5 64 65 ; ASM-NEXT: ldr r1, [sp, #4088] 66 ; DIS-NEXT: 10: e59d1ff8 67 ; IASM-NEXT: .byte 0xf8 68 ; IASM-NEXT: .byte 0x1f 69 ; IASM-NEXT: .byte 0x9d 70 ; IASM-NEXT: .byte 0xe5 71 72 ; ASM-NEXT: mul r0, r0, r1 73 ; DIS-NEXT: 14: e0000190 74 ; IASM-NEXT: .byte 0x90 75 ; IASM-NEXT: .byte 0x1 76 ; IASM-NEXT: .byte 0x0 77 ; IASM-NEXT: .byte 0xe0 78 79 ; ASM-NEXT: str r0, [sp, #4084] 80 ; DIS-NEXT: 18: e58d0ff4 81 ; IASM-NEXT: .byte 0xf4 82 ; IASM-NEXT: .byte 0xf 83 ; IASM-NEXT: .byte 0x8d 84 ; IASM-NEXT: .byte 0xe5 85 86 ; ASM-NEXT: # [sp, #4084] = def.pseudo 87 88 ret i32 %mul 89 90 ; ASM-NEXT: ldr r0, [sp, #4084] 91 ; DIS-NEXT: 1c: e59d0ff4 92 ; IASM-NEXT: .byte 0xf4 93 ; IASM-NEXT: .byte 0xf 94 ; IASM-NEXT: .byte 0x9d 95 ; IASM-NEXT: .byte 0xe5 96 97 ; ASM-NEXT: movw ip, #4092 98 ; DIS-NEXT: 20: e300cffc 99 ; IASM-NEXT: .byte 0xfc 100 ; IASM-NEXT: .byte 0xcf 101 ; IASM-NEXT: .byte 0x0 102 ; IASM-NEXT: .byte 0xe3 103 104 ; ASM-NEXT: add sp, sp, ip 105 ; DIS-NEXT: 24: e08dd00c 106 ; IASM-NEXT: .byte 0xc 107 ; IASM-NEXT: .byte 0xd0 108 ; IASM-NEXT: .byte 0x8d 109 ; IASM-NEXT: .byte 0xe0 110 111 ; ASM-NEXT: bx lr 112 ; DIS-NEXT: 28: e12fff1e 113 ; IASM-NEXT: .byte 0x1e 114 ; IASM-NEXT: .byte 0xff 115 ; IASM-NEXT: .byte 0x2f 116 ; IASM-NEXT: .byte 0xe1 117 118 } 119 120 define internal void @saveConstI32(i32 %loc) { 121 ; ASM-LABEL:saveConstI32: 122 ; DIS-LABEL:00000030 <saveConstI32>: 123 ; IASM-LABEL:saveConstI32: 124 125 entry: 126 ; ASM-NEXT:.LsaveConstI32$entry: 127 ; IASM-NEXT:.LsaveConstI32$entry: 128 129 ; ASM-NEXT: movw ip, #4088 130 ; DIS-NEXT: 30: e300cff8 131 ; IASM-NEXT: .byte 0xf8 132 ; IASM-NEXT: .byte 0xcf 133 ; IASM-NEXT: .byte 0x0 134 ; IASM-NEXT: .byte 0xe3 135 136 ; ASM-NEXT: sub sp, sp, ip 137 ; DIS-NEXT: 34: e04dd00c 138 ; IASM-NEXT: .byte 0xc 139 ; IASM-NEXT: .byte 0xd0 140 ; IASM-NEXT: .byte 0x4d 141 ; IASM-NEXT: .byte 0xe0 142 143 ; ASM-NEXT: str r0, [sp, #4084] 144 ; ASM-NEXT: # [sp, #4084] = def.pseudo 145 ; DIS-NEXT: 38: e58d0ff4 146 ; IASM-NEXT: .byte 0xf4 147 ; IASM-NEXT: .byte 0xf 148 ; IASM-NEXT: .byte 0x8d 149 ; IASM-NEXT: .byte 0xe5 150 151 %loc.asptr = inttoptr i32 %loc to i32* 152 store i32 524289, i32* %loc.asptr, align 1 153 154 ; ASM-NEXT: ldr r0, [sp, #4084] 155 ; DIS-NEXT: 3c: e59d0ff4 156 ; IASM-NEXT: .byte 0xf4 157 ; IASM-NEXT: .byte 0xf 158 ; IASM-NEXT: .byte 0x9d 159 ; IASM-NEXT: .byte 0xe5 160 161 ; ASM-NEXT: movw r1, #1 162 ; DIS-NEXT: 40: e3001001 163 ; IASM-NEXT: .byte 0x1 164 ; IASM-NEXT: .byte 0x10 165 ; IASM-NEXT: .byte 0x0 166 ; IASM-NEXT: .byte 0xe3 167 168 ; ASM-NEXT: movt r1, #8 169 ; DIS-NEXT: 44: e3401008 170 ; IASM-NEXT: .byte 0x8 171 ; IASM-NEXT: .byte 0x10 172 ; IASM-NEXT: .byte 0x40 173 ; IASM-NEXT: .byte 0xe3 174 175 ; ASM-NEXT: str r1, [r0] 176 ; DIS-NEXT: 48: e5801000 177 ; IASM-NEXT: .byte 0x0 178 ; IASM-NEXT: .byte 0x10 179 ; IASM-NEXT: .byte 0x80 180 ; IASM-NEXT: .byte 0xe5 181 182 ret void 183 184 ; ASM-NEXT: movw ip, #4088 185 ; DIS-NEXT: 4c: e300cff8 186 ; IASM-NEXT: .byte 0xf8 187 ; IASM-NEXT: .byte 0xcf 188 ; IASM-NEXT: .byte 0x0 189 ; IASM-NEXT: .byte 0xe3 190 191 ; ASM-NEXT: add sp, sp, ip 192 ; DIS-NEXT: 50: e08dd00c 193 ; IASM-NEXT: .byte 0xc 194 ; IASM-NEXT: .byte 0xd0 195 ; IASM-NEXT: .byte 0x8d 196 ; IASM-NEXT: .byte 0xe0 197 198 ; ASM-NEXT: bx lr 199 ; DIS-NEXT: 54: e12fff1e 200 ; IASM-NEXT: .byte 0x1e 201 ; IASM-NEXT: .byte 0xff 202 ; IASM-NEXT: .byte 0x2f 203 ; IASM-NEXT: .byte 0xe1 204 } 205