| // Based on cmd/internal/obj/ppc64/a.out.go. |
| // |
| // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
| // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
| // Portions Copyright © 1997-1999 Vita Nuova Limited |
| // Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) |
| // Portions Copyright © 2004,2006 Bruce Ellis |
| // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
| // Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others |
| // Portions Copyright © 2009 The Go Authors. All rights reserved. |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a copy |
| // of this software and associated documentation files (the "Software"), to deal |
| // in the Software without restriction, including without limitation the rights |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| // copies of the Software, and to permit persons to whom the Software is |
| // furnished to do so, subject to the following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included in |
| // all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| // THE SOFTWARE. |
| |
| package s390x |
| |
| import "cmd/internal/obj" |
| |
| //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p s390x |
| |
| const ( |
| NSNAME = 8 |
| NSYM = 50 |
| NREG = 16 // number of general purpose registers |
| NFREG = 16 // number of floating point registers |
| ) |
| |
| const ( |
| // General purpose registers (GPRs). |
| REG_R0 = obj.RBaseS390X + iota |
| REG_R1 |
| REG_R2 |
| REG_R3 |
| REG_R4 |
| REG_R5 |
| REG_R6 |
| REG_R7 |
| REG_R8 |
| REG_R9 |
| REG_R10 |
| REG_R11 |
| REG_R12 |
| REG_R13 |
| REG_R14 |
| REG_R15 |
| |
| // Floating point registers (FPRs). |
| REG_F0 |
| REG_F1 |
| REG_F2 |
| REG_F3 |
| REG_F4 |
| REG_F5 |
| REG_F6 |
| REG_F7 |
| REG_F8 |
| REG_F9 |
| REG_F10 |
| REG_F11 |
| REG_F12 |
| REG_F13 |
| REG_F14 |
| REG_F15 |
| |
| // Vector registers (VRs) - only available when the vector |
| // facility is installed. |
| // V0-V15 are aliases for F0-F15. |
| // We keep them in a separate space to make printing etc. easier |
| // If the code generator ever emits vector instructions it will |
| // need to take into account the aliasing. |
| REG_V0 |
| REG_V1 |
| REG_V2 |
| REG_V3 |
| REG_V4 |
| REG_V5 |
| REG_V6 |
| REG_V7 |
| REG_V8 |
| REG_V9 |
| REG_V10 |
| REG_V11 |
| REG_V12 |
| REG_V13 |
| REG_V14 |
| REG_V15 |
| REG_V16 |
| REG_V17 |
| REG_V18 |
| REG_V19 |
| REG_V20 |
| REG_V21 |
| REG_V22 |
| REG_V23 |
| REG_V24 |
| REG_V25 |
| REG_V26 |
| REG_V27 |
| REG_V28 |
| REG_V29 |
| REG_V30 |
| REG_V31 |
| |
| // Access registers (ARs). |
| // The thread pointer is typically stored in the register pair |
| // AR0 and AR1. |
| REG_AR0 |
| REG_AR1 |
| REG_AR2 |
| REG_AR3 |
| REG_AR4 |
| REG_AR5 |
| REG_AR6 |
| REG_AR7 |
| REG_AR8 |
| REG_AR9 |
| REG_AR10 |
| REG_AR11 |
| REG_AR12 |
| REG_AR13 |
| REG_AR14 |
| REG_AR15 |
| |
| REG_RESERVED // end of allocated registers |
| |
| REGARG = -1 // -1 disables passing the first argument in register |
| REGRT1 = REG_R3 // used during zeroing of the stack - not reserved |
| REGRT2 = REG_R4 // used during zeroing of the stack - not reserved |
| REGTMP = REG_R10 // scratch register used in the assembler and linker |
| REGTMP2 = REG_R11 // scratch register used in the assembler and linker |
| REGCTXT = REG_R12 // context for closures |
| REGG = REG_R13 // G |
| REG_LR = REG_R14 // link register |
| REGSP = REG_R15 // stack pointer |
| ) |
| |
| // LINUX for zSeries ELF Application Binary Interface Supplement |
| // https://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_zSeries/x1472.html |
| var S390XDWARFRegisters = map[int16]int16{} |
| |
| func init() { |
| // f assigns dwarfregisters[from:to by step] = (base):((to-from)/step+base) |
| f := func(from, step, to, base int16) { |
| for r := int16(from); r <= to; r += step { |
| S390XDWARFRegisters[r] = (r-from)/step + base |
| } |
| } |
| f(REG_R0, 1, REG_R15, 0) |
| |
| f(REG_F0, 2, REG_F6, 16) |
| f(REG_F1, 2, REG_F7, 20) |
| f(REG_F8, 2, REG_F14, 24) |
| f(REG_F9, 2, REG_F15, 28) |
| |
| f(REG_V0, 2, REG_V6, 16) // V0:15 aliased to F0:15 |
| f(REG_V1, 2, REG_V7, 20) // TODO what about V16:31? |
| f(REG_V8, 2, REG_V14, 24) |
| f(REG_V9, 2, REG_V15, 28) |
| |
| f(REG_AR0, 1, REG_AR15, 48) |
| } |
| |
| const ( |
| BIG = 32768 - 8 |
| DISP12 = 4096 |
| DISP16 = 65536 |
| DISP20 = 1048576 |
| ) |
| |
| const ( |
| // mark flags |
| LEAF = 1 << iota |
| BRANCH |
| USETMP // generated code of this Prog uses REGTMP |
| ) |
| |
| const ( // comments from func aclass in asmz.go |
| C_NONE = iota |
| C_REG // general-purpose register (64-bit) |
| C_FREG // floating-point register (64-bit) |
| C_VREG // vector register (128-bit) |
| C_AREG // access register (32-bit) |
| C_ZCON // constant == 0 |
| C_SCON // 0 <= constant <= 0x7fff (positive int16) |
| C_UCON // constant & 0xffff == 0 (int16 or uint16) |
| C_ADDCON // 0 > constant >= -0x8000 (negative int16) |
| C_ANDCON // constant <= 0xffff |
| C_LCON // constant (int32 or uint32) |
| C_DCON // constant (int64 or uint64) |
| C_SACON // computed address, 16-bit displacement, possibly SP-relative |
| C_LACON // computed address, 32-bit displacement, possibly SP-relative |
| C_DACON // computed address, 64-bit displacement? |
| C_SBRA // short branch |
| C_LBRA // long branch |
| C_SAUTO // short auto |
| C_LAUTO // long auto |
| C_ZOREG // heap address, register-based, displacement == 0 |
| C_SOREG // heap address, register-based, int16 displacement |
| C_LOREG // heap address, register-based, int32 displacement |
| C_TLS_LE // TLS - local exec model (for executables) |
| C_TLS_IE // TLS - initial exec model (for shared libraries loaded at program startup) |
| C_GOK // general address |
| C_ADDR // relocation for extern or static symbols (loads and stores) |
| C_SYMADDR // relocation for extern or static symbols (address taking) |
| C_GOTADDR // GOT slot for a symbol in -dynlink mode |
| C_TEXTSIZE // text size |
| C_ANY |
| C_NCLASS // must be the last |
| ) |
| |
| const ( |
| // integer arithmetic |
| AADD = obj.ABaseS390X + obj.A_ARCHSPECIFIC + iota |
| AADDC |
| AADDE |
| AADDW |
| ADIVW |
| ADIVWU |
| ADIVD |
| ADIVDU |
| AMODW |
| AMODWU |
| AMODD |
| AMODDU |
| AMULLW |
| AMULLD |
| AMULHD |
| AMULHDU |
| AMLGR |
| ASUB |
| ASUBC |
| ASUBV |
| ASUBE |
| ASUBW |
| ANEG |
| ANEGW |
| |
| // integer moves |
| AMOVWBR |
| AMOVB |
| AMOVBZ |
| AMOVH |
| AMOVHBR |
| AMOVHZ |
| AMOVW |
| AMOVWZ |
| AMOVD |
| AMOVDBR |
| |
| // conditional moves |
| AMOVDEQ |
| AMOVDGE |
| AMOVDGT |
| AMOVDLE |
| AMOVDLT |
| AMOVDNE |
| ALOCR |
| ALOCGR |
| |
| // find leftmost one |
| AFLOGR |
| |
| // population count |
| APOPCNT |
| |
| // integer bitwise |
| AAND |
| AANDW |
| AOR |
| AORW |
| AXOR |
| AXORW |
| ASLW |
| ASLD |
| ASRW |
| ASRAW |
| ASRD |
| ASRAD |
| ARLL |
| ARLLG |
| ARNSBG |
| ARXSBG |
| AROSBG |
| ARNSBGT |
| ARXSBGT |
| AROSBGT |
| ARISBG |
| ARISBGN |
| ARISBGZ |
| ARISBGNZ |
| ARISBHG |
| ARISBLG |
| ARISBHGZ |
| ARISBLGZ |
| |
| // floating point |
| AFABS |
| AFADD |
| AFADDS |
| AFCMPO |
| AFCMPU |
| ACEBR |
| AFDIV |
| AFDIVS |
| AFMADD |
| AFMADDS |
| AFMOVD |
| AFMOVS |
| AFMSUB |
| AFMSUBS |
| AFMUL |
| AFMULS |
| AFNABS |
| AFNEG |
| AFNEGS |
| ALEDBR |
| ALDEBR |
| ALPDFR |
| ALNDFR |
| AFSUB |
| AFSUBS |
| AFSQRT |
| AFSQRTS |
| AFIEBR |
| AFIDBR |
| ACPSDR |
| ALTEBR |
| ALTDBR |
| ATCEB |
| ATCDB |
| |
| // move from GPR to FPR and vice versa |
| ALDGR |
| ALGDR |
| |
| // convert from int32/int64 to float/float64 |
| ACEFBRA |
| ACDFBRA |
| ACEGBRA |
| ACDGBRA |
| |
| // convert from float/float64 to int32/int64 |
| ACFEBRA |
| ACFDBRA |
| ACGEBRA |
| ACGDBRA |
| |
| // convert from uint32/uint64 to float/float64 |
| ACELFBR |
| ACDLFBR |
| ACELGBR |
| ACDLGBR |
| |
| // convert from float/float64 to uint32/uint64 |
| ACLFEBR |
| ACLFDBR |
| ACLGEBR |
| ACLGDBR |
| |
| // compare |
| ACMP |
| ACMPU |
| ACMPW |
| ACMPWU |
| |
| // test under mask |
| ATMHH |
| ATMHL |
| ATMLH |
| ATMLL |
| |
| // insert program mask |
| AIPM |
| |
| // set program mask |
| ASPM |
| |
| // compare and swap |
| ACS |
| ACSG |
| |
| // serialize |
| ASYNC |
| |
| // branch |
| ABC |
| ABCL |
| ABRC |
| ABEQ |
| ABGE |
| ABGT |
| ABLE |
| ABLT |
| ABLEU |
| ABLTU |
| ABNE |
| ABVC |
| ABVS |
| ASYSCALL |
| |
| // branch on count |
| ABRCT |
| ABRCTG |
| |
| // compare and branch |
| ACRJ |
| ACGRJ |
| ACLRJ |
| ACLGRJ |
| ACIJ |
| ACGIJ |
| ACLIJ |
| ACLGIJ |
| ACMPBEQ |
| ACMPBGE |
| ACMPBGT |
| ACMPBLE |
| ACMPBLT |
| ACMPBNE |
| ACMPUBEQ |
| ACMPUBGE |
| ACMPUBGT |
| ACMPUBLE |
| ACMPUBLT |
| ACMPUBNE |
| |
| // storage-and-storage |
| AMVC |
| AMVCIN |
| ACLC |
| AXC |
| AOC |
| ANC |
| |
| // load |
| AEXRL |
| ALARL |
| ALA |
| ALAY |
| |
| // interlocked load and op |
| ALAA |
| ALAAG |
| ALAAL |
| ALAALG |
| ALAN |
| ALANG |
| ALAX |
| ALAXG |
| ALAO |
| ALAOG |
| |
| // load/store multiple |
| ALMY |
| ALMG |
| ASTMY |
| ASTMG |
| |
| // store clock |
| ASTCK |
| ASTCKC |
| ASTCKE |
| ASTCKF |
| |
| // macros |
| ACLEAR |
| |
| // vector |
| AVA |
| AVAB |
| AVAH |
| AVAF |
| AVAG |
| AVAQ |
| AVACC |
| AVACCB |
| AVACCH |
| AVACCF |
| AVACCG |
| AVACCQ |
| AVAC |
| AVACQ |
| AVACCC |
| AVACCCQ |
| AVN |
| AVNC |
| AVAVG |
| AVAVGB |
| AVAVGH |
| AVAVGF |
| AVAVGG |
| AVAVGL |
| AVAVGLB |
| AVAVGLH |
| AVAVGLF |
| AVAVGLG |
| AVCKSM |
| AVCEQ |
| AVCEQB |
| AVCEQH |
| AVCEQF |
| AVCEQG |
| AVCEQBS |
| AVCEQHS |
| AVCEQFS |
| AVCEQGS |
| AVCH |
| AVCHB |
| AVCHH |
| AVCHF |
| AVCHG |
| AVCHBS |
| AVCHHS |
| AVCHFS |
| AVCHGS |
| AVCHL |
| AVCHLB |
| AVCHLH |
| AVCHLF |
| AVCHLG |
| AVCHLBS |
| AVCHLHS |
| AVCHLFS |
| AVCHLGS |
| AVCLZ |
| AVCLZB |
| AVCLZH |
| AVCLZF |
| AVCLZG |
| AVCTZ |
| AVCTZB |
| AVCTZH |
| AVCTZF |
| AVCTZG |
| AVEC |
| AVECB |
| AVECH |
| AVECF |
| AVECG |
| AVECL |
| AVECLB |
| AVECLH |
| AVECLF |
| AVECLG |
| AVERIM |
| AVERIMB |
| AVERIMH |
| AVERIMF |
| AVERIMG |
| AVERLL |
| AVERLLB |
| AVERLLH |
| AVERLLF |
| AVERLLG |
| AVERLLV |
| AVERLLVB |
| AVERLLVH |
| AVERLLVF |
| AVERLLVG |
| AVESLV |
| AVESLVB |
| AVESLVH |
| AVESLVF |
| AVESLVG |
| AVESL |
| AVESLB |
| AVESLH |
| AVESLF |
| AVESLG |
| AVESRA |
| AVESRAB |
| AVESRAH |
| AVESRAF |
| AVESRAG |
| AVESRAV |
| AVESRAVB |
| AVESRAVH |
| AVESRAVF |
| AVESRAVG |
| AVESRL |
| AVESRLB |
| AVESRLH |
| AVESRLF |
| AVESRLG |
| AVESRLV |
| AVESRLVB |
| AVESRLVH |
| AVESRLVF |
| AVESRLVG |
| AVX |
| AVFAE |
| AVFAEB |
| AVFAEH |
| AVFAEF |
| AVFAEBS |
| AVFAEHS |
| AVFAEFS |
| AVFAEZB |
| AVFAEZH |
| AVFAEZF |
| AVFAEZBS |
| AVFAEZHS |
| AVFAEZFS |
| AVFEE |
| AVFEEB |
| AVFEEH |
| AVFEEF |
| AVFEEBS |
| AVFEEHS |
| AVFEEFS |
| AVFEEZB |
| AVFEEZH |
| AVFEEZF |
| AVFEEZBS |
| AVFEEZHS |
| AVFEEZFS |
| AVFENE |
| AVFENEB |
| AVFENEH |
| AVFENEF |
| AVFENEBS |
| AVFENEHS |
| AVFENEFS |
| AVFENEZB |
| AVFENEZH |
| AVFENEZF |
| AVFENEZBS |
| AVFENEZHS |
| AVFENEZFS |
| AVFA |
| AVFADB |
| AWFADB |
| AWFK |
| AWFKDB |
| AVFCE |
| AVFCEDB |
| AVFCEDBS |
| AWFCEDB |
| AWFCEDBS |
| AVFCH |
| AVFCHDB |
| AVFCHDBS |
| AWFCHDB |
| AWFCHDBS |
| AVFCHE |
| AVFCHEDB |
| AVFCHEDBS |
| AWFCHEDB |
| AWFCHEDBS |
| AWFC |
| AWFCDB |
| AVCDG |
| AVCDGB |
| AWCDGB |
| AVCDLG |
| AVCDLGB |
| AWCDLGB |
| AVCGD |
| AVCGDB |
| AWCGDB |
| AVCLGD |
| AVCLGDB |
| AWCLGDB |
| AVFD |
| AVFDDB |
| AWFDDB |
| AVLDE |
| AVLDEB |
| AWLDEB |
| AVLED |
| AVLEDB |
| AWLEDB |
| AVFM |
| AVFMDB |
| AWFMDB |
| AVFMA |
| AVFMADB |
| AWFMADB |
| AVFMS |
| AVFMSDB |
| AWFMSDB |
| AVFPSO |
| AVFPSODB |
| AWFPSODB |
| AVFLCDB |
| AWFLCDB |
| AVFLNDB |
| AWFLNDB |
| AVFLPDB |
| AWFLPDB |
| AVFSQ |
| AVFSQDB |
| AWFSQDB |
| AVFS |
| AVFSDB |
| AWFSDB |
| AVFTCI |
| AVFTCIDB |
| AWFTCIDB |
| AVGFM |
| AVGFMB |
| AVGFMH |
| AVGFMF |
| AVGFMG |
| AVGFMA |
| AVGFMAB |
| AVGFMAH |
| AVGFMAF |
| AVGFMAG |
| AVGEF |
| AVGEG |
| AVGBM |
| AVZERO |
| AVONE |
| AVGM |
| AVGMB |
| AVGMH |
| AVGMF |
| AVGMG |
| AVISTR |
| AVISTRB |
| AVISTRH |
| AVISTRF |
| AVISTRBS |
| AVISTRHS |
| AVISTRFS |
| AVL |
| AVLR |
| AVLREP |
| AVLREPB |
| AVLREPH |
| AVLREPF |
| AVLREPG |
| AVLC |
| AVLCB |
| AVLCH |
| AVLCF |
| AVLCG |
| AVLEH |
| AVLEF |
| AVLEG |
| AVLEB |
| AVLEIH |
| AVLEIF |
| AVLEIG |
| AVLEIB |
| AVFI |
| AVFIDB |
| AWFIDB |
| AVLGV |
| AVLGVB |
| AVLGVH |
| AVLGVF |
| AVLGVG |
| AVLLEZ |
| AVLLEZB |
| AVLLEZH |
| AVLLEZF |
| AVLLEZG |
| AVLM |
| AVLP |
| AVLPB |
| AVLPH |
| AVLPF |
| AVLPG |
| AVLBB |
| AVLVG |
| AVLVGB |
| AVLVGH |
| AVLVGF |
| AVLVGG |
| AVLVGP |
| AVLL |
| AVMX |
| AVMXB |
| AVMXH |
| AVMXF |
| AVMXG |
| AVMXL |
| AVMXLB |
| AVMXLH |
| AVMXLF |
| AVMXLG |
| AVMRH |
| AVMRHB |
| AVMRHH |
| AVMRHF |
| AVMRHG |
| AVMRL |
| AVMRLB |
| AVMRLH |
| AVMRLF |
| AVMRLG |
| AVMN |
| AVMNB |
| AVMNH |
| AVMNF |
| AVMNG |
| AVMNL |
| AVMNLB |
| AVMNLH |
| AVMNLF |
| AVMNLG |
| AVMAE |
| AVMAEB |
| AVMAEH |
| AVMAEF |
| AVMAH |
| AVMAHB |
| AVMAHH |
| AVMAHF |
| AVMALE |
| AVMALEB |
| AVMALEH |
| AVMALEF |
| AVMALH |
| AVMALHB |
| AVMALHH |
| AVMALHF |
| AVMALO |
| AVMALOB |
| AVMALOH |
| AVMALOF |
| AVMAL |
| AVMALB |
| AVMALHW |
| AVMALF |
| AVMAO |
| AVMAOB |
| AVMAOH |
| AVMAOF |
| AVME |
| AVMEB |
| AVMEH |
| AVMEF |
| AVMH |
| AVMHB |
| AVMHH |
| AVMHF |
| AVMLE |
| AVMLEB |
| AVMLEH |
| AVMLEF |
| AVMLH |
| AVMLHB |
| AVMLHH |
| AVMLHF |
| AVMLO |
| AVMLOB |
| AVMLOH |
| AVMLOF |
| AVML |
| AVMLB |
| AVMLHW |
| AVMLF |
| AVMO |
| AVMOB |
| AVMOH |
| AVMOF |
| AVNO |
| AVNOT |
| AVO |
| AVPK |
| AVPKH |
| AVPKF |
| AVPKG |
| AVPKLS |
| AVPKLSH |
| AVPKLSF |
| AVPKLSG |
| AVPKLSHS |
| AVPKLSFS |
| AVPKLSGS |
| AVPKS |
| AVPKSH |
| AVPKSF |
| AVPKSG |
| AVPKSHS |
| AVPKSFS |
| AVPKSGS |
| AVPERM |
| AVPDI |
| AVPOPCT |
| AVREP |
| AVREPB |
| AVREPH |
| AVREPF |
| AVREPG |
| AVREPI |
| AVREPIB |
| AVREPIH |
| AVREPIF |
| AVREPIG |
| AVSCEF |
| AVSCEG |
| AVSEL |
| AVSL |
| AVSLB |
| AVSLDB |
| AVSRA |
| AVSRAB |
| AVSRL |
| AVSRLB |
| AVSEG |
| AVSEGB |
| AVSEGH |
| AVSEGF |
| AVST |
| AVSTEH |
| AVSTEF |
| AVSTEG |
| AVSTEB |
| AVSTM |
| AVSTL |
| AVSTRC |
| AVSTRCB |
| AVSTRCH |
| AVSTRCF |
| AVSTRCBS |
| AVSTRCHS |
| AVSTRCFS |
| AVSTRCZB |
| AVSTRCZH |
| AVSTRCZF |
| AVSTRCZBS |
| AVSTRCZHS |
| AVSTRCZFS |
| AVS |
| AVSB |
| AVSH |
| AVSF |
| AVSG |
| AVSQ |
| AVSCBI |
| AVSCBIB |
| AVSCBIH |
| AVSCBIF |
| AVSCBIG |
| AVSCBIQ |
| AVSBCBI |
| AVSBCBIQ |
| AVSBI |
| AVSBIQ |
| AVSUMG |
| AVSUMGH |
| AVSUMGF |
| AVSUMQ |
| AVSUMQF |
| AVSUMQG |
| AVSUM |
| AVSUMB |
| AVSUMH |
| AVTM |
| AVUPH |
| AVUPHB |
| AVUPHH |
| AVUPHF |
| AVUPLH |
| AVUPLHB |
| AVUPLHH |
| AVUPLHF |
| AVUPLL |
| AVUPLLB |
| AVUPLLH |
| AVUPLLF |
| AVUPL |
| AVUPLB |
| AVUPLHW |
| AVUPLF |
| AVMSLG |
| AVMSLEG |
| AVMSLOG |
| AVMSLEOG |
| |
| ANOPH // NOP |
| |
| // binary |
| ABYTE |
| AWORD |
| ADWORD |
| |
| // Breakpoint |
| ABRRK |
| |
| // end marker |
| ALAST |
| |
| // aliases |
| ABR = obj.AJMP |
| ABL = obj.ACALL |
| ) |