1# RUN: llvm-mc -triple mips-unknown-linux -target-abi o32 -filetype=obj -o - %s | \ 2# RUN: llvm-objdump -d -r -z - | FileCheck --check-prefixes=ALL,O32 %s 3 4# RUN: llvm-mc -triple mips-unknown-linux -target-abi o32 %s | \ 5# RUN: FileCheck -check-prefixes=ASM,ASM-O32 %s 6 7# FIXME: Now we check .cpsetup expansion for `-mno-shared` case only. 8# We also need to implement/check the `-mshared` case. 9# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 -filetype=obj -o - %s | \ 10# RUN: llvm-objdump -d -r -z - | \ 11# RUN: FileCheck -check-prefixes=ALL,NXX,N32 %s 12 13# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 %s | \ 14# RUN: FileCheck -check-prefixes=ASM,ASM-N32 %s 15 16# RUN: llvm-mc -triple mips64-unknown-linux %s -filetype=obj -o - | \ 17# RUN: llvm-objdump -d -r -z - | \ 18# RUN: FileCheck -check-prefixes=ALL,NXX,N64 %s 19 20# RUN: llvm-mc -triple mips64-unknown-linux %s | \ 21# RUN: FileCheck -check-prefixes=ASM,ASM-N64 %s 22 23 .text 24 .option pic2 25t1: 26 .cpsetup $25, 8, __cerror 27 nop 28 .cpreturn 29 nop 30 31# ALL-LABEL: <t1>: 32# ASM-LABEL: t1: 33 34# O32-NOT: __cerror 35 36# NXX-NEXT: sd $gp, 8($sp) 37# NXX-NEXT: lui $gp, 0 38# N32-NEXT: R_MIPS_HI16 __gnu_local_gp 39# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror 40# NXX-NEXT: addiu $gp, $gp, 0 41# N32-NEXT: R_MIPS_LO16 __gnu_local_gp 42# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror 43# N64-NEXT: daddu $gp, $gp, $25 44 45# ASM-NEXT: .cpsetup $25, 8, __cerror 46 47# ALL-NEXT: nop 48 49# ASM: .cpreturn 50# NXX-NEXT: ld $gp, 8($sp) 51 52# ALL-NEXT: nop 53 54t2: 55 .cpsetup $25, $2, __cerror 56 nop 57 .cpreturn 58 nop 59 60# ALL-LABEL: <t2>: 61# ASM-LABEL: t2: 62 63# O32-NOT: __cerror 64 65# NXX-NEXT: move $2, $gp 66# NXX-NEXT: lui $gp, 0 67# N32-NEXT: R_MIPS_HI16 __gnu_local_gp 68# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror 69# NXX-NEXT: addiu $gp, $gp, 0 70# N32-NEXT: R_MIPS_LO16 __gnu_local_gp 71# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror 72# N64-NEXT: daddu $gp, $gp, $25 73 74# ASM-NEXT: .cpsetup $25, $2, __cerror 75 76# ALL-NEXT: nop 77 78# ASM: .cpreturn 79# NXX-NEXT: move $gp, $2 80 81# ALL-NEXT: nop 82 83# .cpsetup with local labels (PR22518): 84 85# The '1:' label isn't emitted in all cases but we still want a label to match 86# so we force one here. 87 88t3: 89 nop 901: 91 .cpsetup $25, $2, 1b 92 nop 93 sub $3, $3, $2 94 95# ALL-LABEL: <t3>: 96# ASM-LABEL: t3: 97# ALL-NEXT: nop 98 99# O32-NEXT: nop 100# O32-NEXT: sub $3, $3, $2 101 102# NXX-NEXT: move $2, $gp 103# NXX-NEXT: lui $gp, 0 104# N32-NEXT: {{^ *0+}}38: R_MIPS_HI16 __gnu_local_gp 105# N64-NEXT: {{^ *0+}}40: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 .text 106# NXX-NEXT: addiu $gp, $gp, 0 107# N32-NEXT: {{^ *0+}}3c: R_MIPS_LO16 __gnu_local_gp 108# N64-NEXT: {{^ *0+}}44: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 .text 109# N64-NEXT: daddu $gp, $gp, $25 110# NXX-NEXT: nop 111# NXX-NEXT: sub $3, $3, $2 112 113# ASM-O32: [[LABEL:\$tmp0]]: 114# ASM-N32: [[LABEL:\.Ltmp0]]: 115# ASM-N64: [[LABEL:\.Ltmp0]]: 116# ASM-NEXT: .cpsetup $25, $2, [[LABEL]] 117 118# Ensure we have at least one instruction between labels so that the labels 119# we're matching aren't removed. 120 nop 121# ALL-NEXT: nop 122 123 .option pic0 124t4: 125 nop 126 .cpsetup $25, 8, __cerror 127 nop 128 .cpreturn 129 nop 130 131# Testing that .cpsetup expands to nothing in this case 132# by checking that the next instruction after the first 133# nop is also a 'nop'. 134 135# ALL-LABEL: <t4>: 136# ASM-LABEL: t4: 137 138# NXX-NEXT: nop 139# NXX-NEXT: nop 140# NXX-NEXT: nop 141 142# ASM-NEXT: nop 143# ASM-NEXT: .cpsetup $25, 8, __cerror 144# ASM-NEXT: nop 145# ASM-NEXT: .cpreturn 146# ASM-NEXT: nop 147 148# Test that we accept constant expressions. 149 .option pic2 150t5: 151 .cpsetup $25, ((8*4) - (3*8)), __cerror 152 nop 153 154# ALL-LABEL: <t5>: 155# ASM-LABEL: t5: 156 157# O32-NOT: __cerror 158 159# NXX-NEXT: sd $gp, 8($sp) 160# NXX-NEXT: lui $gp, 0 161# N32-NEXT: R_MIPS_HI16 __gnu_local_gp 162# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror 163# NXX-NEXT: addiu $gp, $gp, 0 164# N32-NEXT: R_MIPS_LO16 __gnu_local_gp 165# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror 166# N64-NEXT: daddu $gp, $gp, $25 167 168# ASM-NEXT: .cpsetup $25, 8, __cerror 169 170# ALL-NEXT: nop 171 172t1b: 173IMM_8 = 8 174 .cpsetup $25, IMM_8, __cerror 175 nop 176 .cpreturn 177 nop 178 179# ALL-LABEL: <t1b>: 180# ASM-LABEL: t1b: 181# ASM-NEXT: .set IMM_8, 8 182 183# O32-NOT: __cerror 184 185# NXX-NEXT: sd $gp, 8($sp) 186# NXX-NEXT: lui $gp, 0 187# N32-NEXT: R_MIPS_HI16 __gnu_local_gp 188# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror 189# NXX-NEXT: addiu $gp, $gp, 0 190# N32-NEXT: R_MIPS_LO16 __gnu_local_gp 191# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror 192# N64-NEXT: daddu $gp, $gp, $25 193 194# ASM-NEXT: .cpsetup $25, 8, __cerror 195 196# ALL-NEXT: nop 197 198# ASM: .cpreturn 199# NXX-NEXT: ld $gp, 8($sp) 200 201# ALL-NEXT: nop 202 203