16691Stjones1@inf.ed.ac.uk// -*- mode:c++ -*- 26691Stjones1@inf.ed.ac.uk 36691Stjones1@inf.ed.ac.uk// Copyright (c) 2009 The University of Edinburgh 46691Stjones1@inf.ed.ac.uk// All rights reserved. 56691Stjones1@inf.ed.ac.uk// 66691Stjones1@inf.ed.ac.uk// Redistribution and use in source and binary forms, with or without 76691Stjones1@inf.ed.ac.uk// modification, are permitted provided that the following conditions are 86691Stjones1@inf.ed.ac.uk// met: redistributions of source code must retain the above copyright 96691Stjones1@inf.ed.ac.uk// notice, this list of conditions and the following disclaimer; 106691Stjones1@inf.ed.ac.uk// redistributions in binary form must reproduce the above copyright 116691Stjones1@inf.ed.ac.uk// notice, this list of conditions and the following disclaimer in the 126691Stjones1@inf.ed.ac.uk// documentation and/or other materials provided with the distribution; 136691Stjones1@inf.ed.ac.uk// neither the name of the copyright holders nor the names of its 146691Stjones1@inf.ed.ac.uk// contributors may be used to endorse or promote products derived from 156691Stjones1@inf.ed.ac.uk// this software without specific prior written permission. 166691Stjones1@inf.ed.ac.uk// 176691Stjones1@inf.ed.ac.uk// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186691Stjones1@inf.ed.ac.uk// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196691Stjones1@inf.ed.ac.uk// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206691Stjones1@inf.ed.ac.uk// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216691Stjones1@inf.ed.ac.uk// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226691Stjones1@inf.ed.ac.uk// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236691Stjones1@inf.ed.ac.uk// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246691Stjones1@inf.ed.ac.uk// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256691Stjones1@inf.ed.ac.uk// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266691Stjones1@inf.ed.ac.uk// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276691Stjones1@inf.ed.ac.uk// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286691Stjones1@inf.ed.ac.uk// 296691Stjones1@inf.ed.ac.uk// Authors: Timothy M. Jones 306691Stjones1@inf.ed.ac.uk 316691Stjones1@inf.ed.ac.uk//////////////////////////////////////////////////////////////////// 326691Stjones1@inf.ed.ac.uk// 336691Stjones1@inf.ed.ac.uk// The actual Power ISA decoder 346691Stjones1@inf.ed.ac.uk// ------------------------------ 356691Stjones1@inf.ed.ac.uk// 366691Stjones1@inf.ed.ac.uk// I've used the Power ISA Book I v2.06 for instruction formats, 376691Stjones1@inf.ed.ac.uk// opcode numbers, register names, etc. 386691Stjones1@inf.ed.ac.uk// 396691Stjones1@inf.ed.ac.ukdecode OPCODE default Unknown::unknown() { 406691Stjones1@inf.ed.ac.uk 416691Stjones1@inf.ed.ac.uk format IntImmOp { 426691Stjones1@inf.ed.ac.uk 10: cmpli({{ 436691Stjones1@inf.ed.ac.uk Xer xer = XER; 446691Stjones1@inf.ed.ac.uk uint32_t cr = makeCRField(Ra, (uint32_t)uimm, xer.so); 456691Stjones1@inf.ed.ac.uk CR = insertCRField(CR, BF, cr); 466691Stjones1@inf.ed.ac.uk }}); 476691Stjones1@inf.ed.ac.uk 11: cmpi({{ 486691Stjones1@inf.ed.ac.uk Xer xer = XER; 498588Sgblack@eecs.umich.edu uint32_t cr = makeCRField(Ra_sw, (int32_t)imm, xer.so); 506691Stjones1@inf.ed.ac.uk CR = insertCRField(CR, BF, cr); 516691Stjones1@inf.ed.ac.uk }}); 526691Stjones1@inf.ed.ac.uk } 536691Stjones1@inf.ed.ac.uk 546691Stjones1@inf.ed.ac.uk // Some instructions use bits 21 - 30, others 22 - 30. We have to use 556691Stjones1@inf.ed.ac.uk // the larger size to account for all opcodes. For those that use the 566691Stjones1@inf.ed.ac.uk // smaller value, the OE bit is bit 21. Therefore, we have two versions 576691Stjones1@inf.ed.ac.uk // of each instruction: 1 with OE set, the other without. For an 586691Stjones1@inf.ed.ac.uk // example see 'add' and 'addo'. 596691Stjones1@inf.ed.ac.uk 31: decode XO_XO { 606691Stjones1@inf.ed.ac.uk 616691Stjones1@inf.ed.ac.uk // These instructions can all be reduced to the form 626691Stjones1@inf.ed.ac.uk // Rt = src1 + src2 [+ CA], therefore we just give src1 and src2 636691Stjones1@inf.ed.ac.uk // (and, if necessary, CA) definitions and let the python script 646691Stjones1@inf.ed.ac.uk // deal with setting things up correctly. We also give flags to 656691Stjones1@inf.ed.ac.uk // say which control registers to set. 666691Stjones1@inf.ed.ac.uk format IntSumOp { 676691Stjones1@inf.ed.ac.uk 266: add({{ Ra }}, {{ Rb }}); 686691Stjones1@inf.ed.ac.uk 40: subf({{ ~Ra }}, {{ Rb }}, {{ 1 }}); 696691Stjones1@inf.ed.ac.uk 10: addc({{ Ra }}, {{ Rb }}, 706691Stjones1@inf.ed.ac.uk computeCA = true); 716691Stjones1@inf.ed.ac.uk 8: subfc({{ ~Ra }}, {{ Rb }}, {{ 1 }}, 726691Stjones1@inf.ed.ac.uk true); 736691Stjones1@inf.ed.ac.uk 104: neg({{ ~Ra }}, {{ 1 }}); 746691Stjones1@inf.ed.ac.uk 138: adde({{ Ra }}, {{ Rb }}, {{ xer.ca }}, 756691Stjones1@inf.ed.ac.uk true); 766691Stjones1@inf.ed.ac.uk 234: addme({{ Ra }}, {{ (uint32_t)-1 }}, {{ xer.ca }}, 776691Stjones1@inf.ed.ac.uk true); 786691Stjones1@inf.ed.ac.uk 136: subfe({{ ~Ra }}, {{ Rb }}, {{ xer.ca }}, 796691Stjones1@inf.ed.ac.uk true); 806691Stjones1@inf.ed.ac.uk 232: subfme({{ ~Ra }}, {{ (uint32_t)-1 }}, {{ xer.ca }}, 816691Stjones1@inf.ed.ac.uk true); 826691Stjones1@inf.ed.ac.uk 202: addze({{ Ra }}, {{ xer.ca }}, 836691Stjones1@inf.ed.ac.uk computeCA = true); 846691Stjones1@inf.ed.ac.uk 200: subfze({{ ~Ra }}, {{ xer.ca }}, 856691Stjones1@inf.ed.ac.uk computeCA = true); 866691Stjones1@inf.ed.ac.uk } 876691Stjones1@inf.ed.ac.uk 886691Stjones1@inf.ed.ac.uk // Arithmetic instructions all use source registers Ra and Rb, 896691Stjones1@inf.ed.ac.uk // with destination register Rt. 906691Stjones1@inf.ed.ac.uk format IntArithOp { 9113800Ssandipan@linux.ibm.com 75: mulhw({{ int64_t prod = Ra_sd * Rb_sd; Rt = prod >> 32; }}); 9213800Ssandipan@linux.ibm.com 11: mulhwu({{ uint64_t prod = Ra_ud * Rb_ud; Rt = prod >> 32; }}); 9313800Ssandipan@linux.ibm.com 235: mullw({{ int64_t prod = Ra_sd * Rb_sd; Rt = prod; }}); 9413800Ssandipan@linux.ibm.com 747: mullwo({{ 9513800Ssandipan@linux.ibm.com int64_t src1 = Ra_sd; 9613800Ssandipan@linux.ibm.com int64_t src2 = Rb; 9713800Ssandipan@linux.ibm.com int64_t prod = src1 * src2; 9813800Ssandipan@linux.ibm.com Rt = prod; 9913800Ssandipan@linux.ibm.com }}, 10013800Ssandipan@linux.ibm.com true); 1016691Stjones1@inf.ed.ac.uk 1026691Stjones1@inf.ed.ac.uk 491: divw({{ 1038588Sgblack@eecs.umich.edu int32_t src1 = Ra_sw; 1048588Sgblack@eecs.umich.edu int32_t src2 = Rb_sw; 1056691Stjones1@inf.ed.ac.uk if ((src1 != 0x80000000 || src2 != 0xffffffff) 1066691Stjones1@inf.ed.ac.uk && src2 != 0) { 1076691Stjones1@inf.ed.ac.uk Rt = src1 / src2; 1086691Stjones1@inf.ed.ac.uk } else { 1096691Stjones1@inf.ed.ac.uk Rt = 0; 1106691Stjones1@inf.ed.ac.uk } 1116691Stjones1@inf.ed.ac.uk }}); 1126691Stjones1@inf.ed.ac.uk 1136691Stjones1@inf.ed.ac.uk 1003: divwo({{ 1148588Sgblack@eecs.umich.edu int32_t src1 = Ra_sw; 1158588Sgblack@eecs.umich.edu int32_t src2 = Rb_sw; 1166691Stjones1@inf.ed.ac.uk if ((src1 != 0x80000000 || src2 != 0xffffffff) 1176691Stjones1@inf.ed.ac.uk && src2 != 0) { 1186691Stjones1@inf.ed.ac.uk Rt = src1 / src2; 1196691Stjones1@inf.ed.ac.uk } else { 1206691Stjones1@inf.ed.ac.uk Rt = 0; 1216691Stjones1@inf.ed.ac.uk divSetOV = true; 1226691Stjones1@inf.ed.ac.uk } 1236691Stjones1@inf.ed.ac.uk }}, 1246691Stjones1@inf.ed.ac.uk true); 1256691Stjones1@inf.ed.ac.uk 1266691Stjones1@inf.ed.ac.uk 459: divwu({{ 1278588Sgblack@eecs.umich.edu uint32_t src1 = Ra_sw; 1288588Sgblack@eecs.umich.edu uint32_t src2 = Rb_sw; 1296691Stjones1@inf.ed.ac.uk if (src2 != 0) { 1306691Stjones1@inf.ed.ac.uk Rt = src1 / src2; 1316691Stjones1@inf.ed.ac.uk } else { 1326691Stjones1@inf.ed.ac.uk Rt = 0; 1336691Stjones1@inf.ed.ac.uk } 1346691Stjones1@inf.ed.ac.uk }}); 1356691Stjones1@inf.ed.ac.uk 1366691Stjones1@inf.ed.ac.uk 971: divwuo({{ 1378588Sgblack@eecs.umich.edu uint32_t src1 = Ra_sw; 1388588Sgblack@eecs.umich.edu uint32_t src2 = Rb_sw; 1396691Stjones1@inf.ed.ac.uk if (src2 != 0) { 1406691Stjones1@inf.ed.ac.uk Rt = src1 / src2; 1416691Stjones1@inf.ed.ac.uk } else { 1426691Stjones1@inf.ed.ac.uk Rt = 0; 1436691Stjones1@inf.ed.ac.uk divSetOV = true; 1446691Stjones1@inf.ed.ac.uk } 1456691Stjones1@inf.ed.ac.uk }}, 1466691Stjones1@inf.ed.ac.uk true); 1476691Stjones1@inf.ed.ac.uk } 1486691Stjones1@inf.ed.ac.uk 1496691Stjones1@inf.ed.ac.uk // Integer logic instructions use source registers Rs and Rb, 1506691Stjones1@inf.ed.ac.uk // with destination register Ra. 1516691Stjones1@inf.ed.ac.uk format IntLogicOp { 1526691Stjones1@inf.ed.ac.uk 28: and({{ Ra = Rs & Rb; }}); 1536691Stjones1@inf.ed.ac.uk 316: xor({{ Ra = Rs ^ Rb; }}); 1546691Stjones1@inf.ed.ac.uk 476: nand({{ Ra = ~(Rs & Rb); }}); 1556691Stjones1@inf.ed.ac.uk 444: or({{ Ra = Rs | Rb; }}); 1566691Stjones1@inf.ed.ac.uk 124: nor({{ Ra = ~(Rs | Rb); }}); 1576691Stjones1@inf.ed.ac.uk 60: andc({{ Ra = Rs & ~Rb; }}); 1586691Stjones1@inf.ed.ac.uk 954: extsb({{ Ra = sext<8>(Rs); }}); 1596691Stjones1@inf.ed.ac.uk 284: eqv({{ Ra = ~(Rs ^ Rb); }}); 1606691Stjones1@inf.ed.ac.uk 412: orc({{ Ra = Rs | ~Rb; }}); 1616691Stjones1@inf.ed.ac.uk 922: extsh({{ Ra = sext<16>(Rs); }}); 1626691Stjones1@inf.ed.ac.uk 26: cntlzw({{ Ra = Rs == 0 ? 32 : 31 - findMsbSet(Rs); }}); 1636691Stjones1@inf.ed.ac.uk 508: cmpb({{ 1646691Stjones1@inf.ed.ac.uk uint32_t val = 0; 1656691Stjones1@inf.ed.ac.uk for (int n = 0; n < 32; n += 8) { 16612692Smattdsinclair@gmail.com if(bits(Rs, n+7, n) == bits(Rb, n+7, n)) { 16712692Smattdsinclair@gmail.com val = insertBits(val, n+7, n, 0xff); 1686691Stjones1@inf.ed.ac.uk } 1696691Stjones1@inf.ed.ac.uk } 1706691Stjones1@inf.ed.ac.uk Ra = val; 1716691Stjones1@inf.ed.ac.uk }}); 1726691Stjones1@inf.ed.ac.uk 1736691Stjones1@inf.ed.ac.uk 24: slw({{ 1746691Stjones1@inf.ed.ac.uk if (Rb & 0x20) { 1756691Stjones1@inf.ed.ac.uk Ra = 0; 1766691Stjones1@inf.ed.ac.uk } else { 1776691Stjones1@inf.ed.ac.uk Ra = Rs << (Rb & 0x1f); 1786691Stjones1@inf.ed.ac.uk } 1796691Stjones1@inf.ed.ac.uk }}); 1806691Stjones1@inf.ed.ac.uk 1816691Stjones1@inf.ed.ac.uk 536: srw({{ 1826691Stjones1@inf.ed.ac.uk if (Rb & 0x20) { 1836691Stjones1@inf.ed.ac.uk Ra = 0; 1846691Stjones1@inf.ed.ac.uk } else { 1856691Stjones1@inf.ed.ac.uk Ra = Rs >> (Rb & 0x1f); 1866691Stjones1@inf.ed.ac.uk } 1876691Stjones1@inf.ed.ac.uk }}); 1886691Stjones1@inf.ed.ac.uk 1896691Stjones1@inf.ed.ac.uk 792: sraw({{ 1906691Stjones1@inf.ed.ac.uk bool shiftSetCA = false; 1916691Stjones1@inf.ed.ac.uk int32_t s = Rs; 1926691Stjones1@inf.ed.ac.uk if (Rb == 0) { 1936691Stjones1@inf.ed.ac.uk Ra = Rs; 1946691Stjones1@inf.ed.ac.uk shiftSetCA = true; 1956691Stjones1@inf.ed.ac.uk } else if (Rb & 0x20) { 1966691Stjones1@inf.ed.ac.uk if (s < 0) { 1976691Stjones1@inf.ed.ac.uk Ra = (uint32_t)-1; 1986691Stjones1@inf.ed.ac.uk if (s & 0x7fffffff) { 1996691Stjones1@inf.ed.ac.uk shiftSetCA = true; 2006691Stjones1@inf.ed.ac.uk } else { 2016691Stjones1@inf.ed.ac.uk shiftSetCA = false; 2026691Stjones1@inf.ed.ac.uk } 2036691Stjones1@inf.ed.ac.uk } else { 2046691Stjones1@inf.ed.ac.uk Ra = 0; 2056691Stjones1@inf.ed.ac.uk shiftSetCA = false; 2066691Stjones1@inf.ed.ac.uk } 2076691Stjones1@inf.ed.ac.uk } else { 2086691Stjones1@inf.ed.ac.uk Ra = s >> (Rb & 0x1f); 2096691Stjones1@inf.ed.ac.uk if (s < 0 && (s << (32 - (Rb & 0x1f))) != 0) { 2106691Stjones1@inf.ed.ac.uk shiftSetCA = true; 2116691Stjones1@inf.ed.ac.uk } else { 2126691Stjones1@inf.ed.ac.uk shiftSetCA = false; 2136691Stjones1@inf.ed.ac.uk } 2146691Stjones1@inf.ed.ac.uk } 2156691Stjones1@inf.ed.ac.uk Xer xer1 = XER; 2166691Stjones1@inf.ed.ac.uk if (shiftSetCA) { 2176691Stjones1@inf.ed.ac.uk xer1.ca = 1; 2186691Stjones1@inf.ed.ac.uk } else { 2196691Stjones1@inf.ed.ac.uk xer1.ca = 0; 2206691Stjones1@inf.ed.ac.uk } 2216691Stjones1@inf.ed.ac.uk XER = xer1; 2226691Stjones1@inf.ed.ac.uk }}); 2236691Stjones1@inf.ed.ac.uk } 2246691Stjones1@inf.ed.ac.uk 2256691Stjones1@inf.ed.ac.uk // Integer logic instructions with a shift value. 2266691Stjones1@inf.ed.ac.uk format IntShiftOp { 2276691Stjones1@inf.ed.ac.uk 824: srawi({{ 2286691Stjones1@inf.ed.ac.uk bool shiftSetCA = false; 2296691Stjones1@inf.ed.ac.uk if (sh == 0) { 2306691Stjones1@inf.ed.ac.uk Ra = Rs; 2316691Stjones1@inf.ed.ac.uk shiftSetCA = false; 2326691Stjones1@inf.ed.ac.uk } else { 2336691Stjones1@inf.ed.ac.uk int32_t s = Rs; 2346691Stjones1@inf.ed.ac.uk Ra = s >> sh; 2356691Stjones1@inf.ed.ac.uk if (s < 0 && (s << (32 - sh)) != 0) { 2366691Stjones1@inf.ed.ac.uk shiftSetCA = true; 2376691Stjones1@inf.ed.ac.uk } else { 2386691Stjones1@inf.ed.ac.uk shiftSetCA = false; 2396691Stjones1@inf.ed.ac.uk } 2406691Stjones1@inf.ed.ac.uk } 2416691Stjones1@inf.ed.ac.uk Xer xer1 = XER; 2426691Stjones1@inf.ed.ac.uk if (shiftSetCA) { 2436691Stjones1@inf.ed.ac.uk xer1.ca = 1; 2446691Stjones1@inf.ed.ac.uk } else { 2456691Stjones1@inf.ed.ac.uk xer1.ca = 0; 2466691Stjones1@inf.ed.ac.uk } 2476691Stjones1@inf.ed.ac.uk XER = xer1; 2486691Stjones1@inf.ed.ac.uk }}); 2496691Stjones1@inf.ed.ac.uk } 2506691Stjones1@inf.ed.ac.uk 2516691Stjones1@inf.ed.ac.uk // Generic integer format instructions. 2526691Stjones1@inf.ed.ac.uk format IntOp { 2536691Stjones1@inf.ed.ac.uk 0: cmp({{ 2546691Stjones1@inf.ed.ac.uk Xer xer = XER; 2558588Sgblack@eecs.umich.edu uint32_t cr = makeCRField(Ra_sw, Rb_sw, xer.so); 2566691Stjones1@inf.ed.ac.uk CR = insertCRField(CR, BF, cr); 2576691Stjones1@inf.ed.ac.uk }}); 2586691Stjones1@inf.ed.ac.uk 32: cmpl({{ 2596691Stjones1@inf.ed.ac.uk Xer xer = XER; 2606691Stjones1@inf.ed.ac.uk uint32_t cr = makeCRField(Ra, Rb, xer.so); 2616691Stjones1@inf.ed.ac.uk CR = insertCRField(CR, BF, cr); 2626691Stjones1@inf.ed.ac.uk }}); 2636691Stjones1@inf.ed.ac.uk 144: mtcrf({{ 2646691Stjones1@inf.ed.ac.uk uint32_t mask = 0; 2656691Stjones1@inf.ed.ac.uk for (int i = 0; i < 8; ++i) { 2666691Stjones1@inf.ed.ac.uk if (((FXM >> i) & 0x1) == 0x1) { 2676691Stjones1@inf.ed.ac.uk mask |= 0xf << (4 * i); 2686691Stjones1@inf.ed.ac.uk } 2696691Stjones1@inf.ed.ac.uk } 2706691Stjones1@inf.ed.ac.uk CR = (Rs & mask) | (CR & ~mask); 2716691Stjones1@inf.ed.ac.uk }}); 2726691Stjones1@inf.ed.ac.uk 19: mfcr({{ Rt = CR; }}); 2736691Stjones1@inf.ed.ac.uk 339: decode SPR { 2746691Stjones1@inf.ed.ac.uk 0x20: mfxer({{ Rt = XER; }}); 2756691Stjones1@inf.ed.ac.uk 0x100: mflr({{ Rt = LR; }}); 2766691Stjones1@inf.ed.ac.uk 0x120: mfctr({{ Rt = CTR; }}); 2776691Stjones1@inf.ed.ac.uk } 2786691Stjones1@inf.ed.ac.uk 467: decode SPR { 2796691Stjones1@inf.ed.ac.uk 0x20: mtxer({{ XER = Rs; }}); 2806691Stjones1@inf.ed.ac.uk 0x100: mtlr({{ LR = Rs; }}); 2816691Stjones1@inf.ed.ac.uk 0x120: mtctr({{ CTR = Rs; }}); 2826691Stjones1@inf.ed.ac.uk } 2836691Stjones1@inf.ed.ac.uk } 2846691Stjones1@inf.ed.ac.uk 2856691Stjones1@inf.ed.ac.uk // All loads with an index register. The non-update versions 2866691Stjones1@inf.ed.ac.uk // all use the value 0 if Ra == R0, not the value contained in 2876691Stjones1@inf.ed.ac.uk // R0. Others update Ra with the effective address. In all cases, 2886691Stjones1@inf.ed.ac.uk // Ra and Rb are source registers, Rt is the destintation. 2896691Stjones1@inf.ed.ac.uk format LoadIndexOp { 2908588Sgblack@eecs.umich.edu 87: lbzx({{ Rt = Mem_ub; }}); 2918588Sgblack@eecs.umich.edu 279: lhzx({{ Rt = Mem_uh; }}); 2928588Sgblack@eecs.umich.edu 343: lhax({{ Rt = Mem_sh; }}); 2936691Stjones1@inf.ed.ac.uk 23: lwzx({{ Rt = Mem; }}); 2948588Sgblack@eecs.umich.edu 341: lwax({{ Rt = Mem_sw; }}); 2958588Sgblack@eecs.umich.edu 20: lwarx({{ Rt = Mem_sw; Rsv = 1; RsvLen = 4; RsvAddr = EA; }}); 2968588Sgblack@eecs.umich.edu 535: lfsx({{ Ft_sf = Mem_sf; }}); 2978588Sgblack@eecs.umich.edu 599: lfdx({{ Ft = Mem_df; }}); 2988588Sgblack@eecs.umich.edu 855: lfiwax({{ Ft_uw = Mem; }}); 2996691Stjones1@inf.ed.ac.uk } 3006691Stjones1@inf.ed.ac.uk 3016691Stjones1@inf.ed.ac.uk format LoadIndexUpdateOp { 3028588Sgblack@eecs.umich.edu 119: lbzux({{ Rt = Mem_ub; }}); 3038588Sgblack@eecs.umich.edu 311: lhzux({{ Rt = Mem_uh; }}); 3048588Sgblack@eecs.umich.edu 375: lhaux({{ Rt = Mem_sh; }}); 3056691Stjones1@inf.ed.ac.uk 55: lwzux({{ Rt = Mem; }}); 3068588Sgblack@eecs.umich.edu 373: lwaux({{ Rt = Mem_sw; }}); 3078588Sgblack@eecs.umich.edu 567: lfsux({{ Ft_sf = Mem_sf; }}); 3088588Sgblack@eecs.umich.edu 631: lfdux({{ Ft = Mem_df; }}); 3096691Stjones1@inf.ed.ac.uk } 3106691Stjones1@inf.ed.ac.uk 3116691Stjones1@inf.ed.ac.uk format StoreIndexOp { 3128588Sgblack@eecs.umich.edu 215: stbx({{ Mem_ub = Rs_ub; }}); 3138588Sgblack@eecs.umich.edu 407: sthx({{ Mem_uh = Rs_uh; }}); 3146691Stjones1@inf.ed.ac.uk 151: stwx({{ Mem = Rs; }}); 3156691Stjones1@inf.ed.ac.uk 150: stwcx({{ 3166691Stjones1@inf.ed.ac.uk bool store_performed = false; 31711327Ssteve.reinhardt@amd.com Mem = Rs; 3186691Stjones1@inf.ed.ac.uk if (Rsv) { 3196691Stjones1@inf.ed.ac.uk if (RsvLen == 4) { 3206691Stjones1@inf.ed.ac.uk if (RsvAddr == EA) { 3216691Stjones1@inf.ed.ac.uk store_performed = true; 3226691Stjones1@inf.ed.ac.uk } 3236691Stjones1@inf.ed.ac.uk } 3246691Stjones1@inf.ed.ac.uk } 3256691Stjones1@inf.ed.ac.uk Xer xer = XER; 3266691Stjones1@inf.ed.ac.uk Cr cr = CR; 3276691Stjones1@inf.ed.ac.uk cr.cr0 = ((store_performed ? 0x2 : 0x0) | xer.so); 3286691Stjones1@inf.ed.ac.uk CR = cr; 3296691Stjones1@inf.ed.ac.uk Rsv = 0; 3306691Stjones1@inf.ed.ac.uk }}); 3318588Sgblack@eecs.umich.edu 663: stfsx({{ Mem_sf = Fs_sf; }}); 3328588Sgblack@eecs.umich.edu 727: stfdx({{ Mem_df = Fs; }}); 3338588Sgblack@eecs.umich.edu 983: stfiwx({{ Mem = Fs_uw; }}); 3346691Stjones1@inf.ed.ac.uk } 3356691Stjones1@inf.ed.ac.uk 3366691Stjones1@inf.ed.ac.uk format StoreIndexUpdateOp { 3378588Sgblack@eecs.umich.edu 247: stbux({{ Mem_ub = Rs_ub; }}); 3388588Sgblack@eecs.umich.edu 439: sthux({{ Mem_uh = Rs_uh; }}); 3396691Stjones1@inf.ed.ac.uk 183: stwux({{ Mem = Rs; }}); 3408588Sgblack@eecs.umich.edu 695: stfsux({{ Mem_sf = Fs_sf; }}); 3418588Sgblack@eecs.umich.edu 759: stfdux({{ Mem_df = Fs; }}); 3426691Stjones1@inf.ed.ac.uk } 3436691Stjones1@inf.ed.ac.uk 3446691Stjones1@inf.ed.ac.uk // These instructions all provide data cache hints 3456691Stjones1@inf.ed.ac.uk format MiscOp { 3466691Stjones1@inf.ed.ac.uk 278: dcbt({{ }}); 3476691Stjones1@inf.ed.ac.uk 246: dcbtst({{ }}); 3486691Stjones1@inf.ed.ac.uk 598: sync({{ }}, [ IsMemBarrier ]); 3496691Stjones1@inf.ed.ac.uk 854: eieio({{ }}, [ IsMemBarrier ]); 3506691Stjones1@inf.ed.ac.uk } 3516691Stjones1@inf.ed.ac.uk } 3526691Stjones1@inf.ed.ac.uk 3536691Stjones1@inf.ed.ac.uk format IntImmArithCheckRaOp { 3546691Stjones1@inf.ed.ac.uk 14: addi({{ Rt = Ra + imm; }}, 3556691Stjones1@inf.ed.ac.uk {{ Rt = imm }}); 3566691Stjones1@inf.ed.ac.uk 15: addis({{ Rt = Ra + (imm << 16); }}, 3576691Stjones1@inf.ed.ac.uk {{ Rt = imm << 16; }}); 3586691Stjones1@inf.ed.ac.uk } 3596691Stjones1@inf.ed.ac.uk 3606691Stjones1@inf.ed.ac.uk format IntImmArithOp { 3616691Stjones1@inf.ed.ac.uk 12: addic({{ uint32_t src = Ra; Rt = src + imm; }}, 3626691Stjones1@inf.ed.ac.uk [computeCA]); 3636691Stjones1@inf.ed.ac.uk 13: addic_({{ uint32_t src = Ra; Rt = src + imm; }}, 3646691Stjones1@inf.ed.ac.uk [computeCA, computeCR0]); 3656691Stjones1@inf.ed.ac.uk 8: subfic({{ int32_t src = ~Ra; Rt = src + imm + 1; }}, 3666691Stjones1@inf.ed.ac.uk [computeCA]); 3676691Stjones1@inf.ed.ac.uk 7: mulli({{ 3688588Sgblack@eecs.umich.edu int32_t src = Ra_sw; 3696691Stjones1@inf.ed.ac.uk int64_t prod = src * imm; 3706691Stjones1@inf.ed.ac.uk Rt = (uint32_t)prod; 3716691Stjones1@inf.ed.ac.uk }}); 3726691Stjones1@inf.ed.ac.uk } 3736691Stjones1@inf.ed.ac.uk 3746691Stjones1@inf.ed.ac.uk format IntImmLogicOp { 3756691Stjones1@inf.ed.ac.uk 24: ori({{ Ra = Rs | uimm; }}); 3766691Stjones1@inf.ed.ac.uk 25: oris({{ Ra = Rs | (uimm << 16); }}); 3776691Stjones1@inf.ed.ac.uk 26: xori({{ Ra = Rs ^ uimm; }}); 3786691Stjones1@inf.ed.ac.uk 27: xoris({{ Ra = Rs ^ (uimm << 16); }}); 3796691Stjones1@inf.ed.ac.uk 28: andi_({{ Ra = Rs & uimm; }}, 3806691Stjones1@inf.ed.ac.uk true); 3816691Stjones1@inf.ed.ac.uk 29: andis_({{ Ra = Rs & (uimm << 16); }}, 3826691Stjones1@inf.ed.ac.uk true); 3836691Stjones1@inf.ed.ac.uk } 3846691Stjones1@inf.ed.ac.uk 3856691Stjones1@inf.ed.ac.uk 16: decode AA { 3866691Stjones1@inf.ed.ac.uk 3876691Stjones1@inf.ed.ac.uk // Conditionally branch relative to PC based on CR and CTR. 3886691Stjones1@inf.ed.ac.uk format BranchPCRelCondCtr { 38913801Ssandipan@linux.ibm.com 0: bc({{ NIA = (uint32_t)(CIA + disp); }}); 3906691Stjones1@inf.ed.ac.uk } 3916691Stjones1@inf.ed.ac.uk 3926691Stjones1@inf.ed.ac.uk // Conditionally branch to fixed address based on CR and CTR. 3936691Stjones1@inf.ed.ac.uk format BranchNonPCRelCondCtr { 39413801Ssandipan@linux.ibm.com 1: bca({{ NIA = targetAddr; }}); 3956691Stjones1@inf.ed.ac.uk } 3966691Stjones1@inf.ed.ac.uk } 3976691Stjones1@inf.ed.ac.uk 3986691Stjones1@inf.ed.ac.uk 18: decode AA { 3996691Stjones1@inf.ed.ac.uk 4006691Stjones1@inf.ed.ac.uk // Unconditionally branch relative to PC. 4016691Stjones1@inf.ed.ac.uk format BranchPCRel { 40213801Ssandipan@linux.ibm.com 0: b({{ NIA = (uint32_t)(CIA + disp); }}); 4036691Stjones1@inf.ed.ac.uk } 4046691Stjones1@inf.ed.ac.uk 4056691Stjones1@inf.ed.ac.uk // Unconditionally branch to fixed address. 4066691Stjones1@inf.ed.ac.uk format BranchNonPCRel { 40713801Ssandipan@linux.ibm.com 1: ba({{ NIA = targetAddr; }}); 4086691Stjones1@inf.ed.ac.uk } 4096691Stjones1@inf.ed.ac.uk } 4106691Stjones1@inf.ed.ac.uk 4116691Stjones1@inf.ed.ac.uk 19: decode XO_XO { 4126691Stjones1@inf.ed.ac.uk 4136691Stjones1@inf.ed.ac.uk // Conditionally branch to address in LR based on CR and CTR. 4146691Stjones1@inf.ed.ac.uk format BranchLrCondCtr { 41513801Ssandipan@linux.ibm.com 16: bclr({{ NIA = LR & 0xfffffffc; }}); 4166691Stjones1@inf.ed.ac.uk } 4176691Stjones1@inf.ed.ac.uk 4186691Stjones1@inf.ed.ac.uk // Conditionally branch to address in CTR based on CR. 4196691Stjones1@inf.ed.ac.uk format BranchCtrCond { 42013801Ssandipan@linux.ibm.com 528: bcctr({{ NIA = CTR & 0xfffffffc; }}); 4216691Stjones1@inf.ed.ac.uk } 4226691Stjones1@inf.ed.ac.uk 4236691Stjones1@inf.ed.ac.uk // Condition register manipulation instructions. 4246691Stjones1@inf.ed.ac.uk format CondLogicOp { 4256691Stjones1@inf.ed.ac.uk 257: crand({{ 4266691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4276691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4286691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa & crBb); 4296691Stjones1@inf.ed.ac.uk }}); 4306691Stjones1@inf.ed.ac.uk 449: cror({{ 4316691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4326691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4336691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa | crBb); 4346691Stjones1@inf.ed.ac.uk }}); 4356691Stjones1@inf.ed.ac.uk 255: crnand({{ 4366691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4376691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4386691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, !(crBa & crBb)); 4396691Stjones1@inf.ed.ac.uk }}); 4406691Stjones1@inf.ed.ac.uk 193: crxor({{ 4416691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4426691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4436691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa ^ crBb); 4446691Stjones1@inf.ed.ac.uk }}); 4456691Stjones1@inf.ed.ac.uk 33: crnor({{ 4466691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4476691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4486691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, !(crBa | crBb)); 4496691Stjones1@inf.ed.ac.uk }}); 4506691Stjones1@inf.ed.ac.uk 289: creqv({{ 4516691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4526691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4536691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa == crBb); 4546691Stjones1@inf.ed.ac.uk }}); 4556691Stjones1@inf.ed.ac.uk 129: crandc({{ 4566691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4576691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4586691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa & !crBb); 4596691Stjones1@inf.ed.ac.uk }}); 4606691Stjones1@inf.ed.ac.uk 417: crorc({{ 4616691Stjones1@inf.ed.ac.uk uint32_t crBa = bits(CR, 31 - ba); 4626691Stjones1@inf.ed.ac.uk uint32_t crBb = bits(CR, 31 - bb); 4636691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bt, crBa | !crBb); 4646691Stjones1@inf.ed.ac.uk }}); 4656691Stjones1@inf.ed.ac.uk } 4666691Stjones1@inf.ed.ac.uk format CondMoveOp { 4676691Stjones1@inf.ed.ac.uk 0: mcrf({{ 4686691Stjones1@inf.ed.ac.uk uint32_t crBfa = bits(CR, 31 - bfa*4, 28 - bfa*4); 4696691Stjones1@inf.ed.ac.uk CR = insertBits(CR, 31 - bf*4, 28 - bf*4, crBfa); 4706691Stjones1@inf.ed.ac.uk }}); 4716691Stjones1@inf.ed.ac.uk } 4726691Stjones1@inf.ed.ac.uk format MiscOp { 4736691Stjones1@inf.ed.ac.uk 150: isync({{ }}, [ IsSerializeAfter ]); 4746691Stjones1@inf.ed.ac.uk } 4756691Stjones1@inf.ed.ac.uk } 4766691Stjones1@inf.ed.ac.uk 4776691Stjones1@inf.ed.ac.uk format IntRotateOp { 4786691Stjones1@inf.ed.ac.uk 21: rlwinm({{ Ra = rotateValue(Rs, sh) & fullMask; }}); 4796691Stjones1@inf.ed.ac.uk 23: rlwnm({{ Ra = rotateValue(Rs, Rb) & fullMask; }}); 4806691Stjones1@inf.ed.ac.uk 20: rlwimi({{ Ra = (rotateValue(Rs, sh) & fullMask) | (Ra & ~fullMask); }}); 4816691Stjones1@inf.ed.ac.uk } 4826691Stjones1@inf.ed.ac.uk 4836691Stjones1@inf.ed.ac.uk format LoadDispOp { 4848588Sgblack@eecs.umich.edu 34: lbz({{ Rt = Mem_ub; }}); 4858588Sgblack@eecs.umich.edu 40: lhz({{ Rt = Mem_uh; }}); 4868588Sgblack@eecs.umich.edu 42: lha({{ Rt = Mem_sh; }}); 4876691Stjones1@inf.ed.ac.uk 32: lwz({{ Rt = Mem; }}); 4888588Sgblack@eecs.umich.edu 58: lwa({{ Rt = Mem_sw; }}, 4896691Stjones1@inf.ed.ac.uk {{ EA = Ra + (disp & 0xfffffffc); }}, 4906691Stjones1@inf.ed.ac.uk {{ EA = disp & 0xfffffffc; }}); 4918588Sgblack@eecs.umich.edu 48: lfs({{ Ft_sf = Mem_sf; }}); 4928588Sgblack@eecs.umich.edu 50: lfd({{ Ft = Mem_df; }}); 4936691Stjones1@inf.ed.ac.uk } 4946691Stjones1@inf.ed.ac.uk 4956691Stjones1@inf.ed.ac.uk format LoadDispUpdateOp { 4968588Sgblack@eecs.umich.edu 35: lbzu({{ Rt = Mem_ub; }}); 4978588Sgblack@eecs.umich.edu 41: lhzu({{ Rt = Mem_uh; }}); 4988588Sgblack@eecs.umich.edu 43: lhau({{ Rt = Mem_sh; }}); 4996691Stjones1@inf.ed.ac.uk 33: lwzu({{ Rt = Mem; }}); 5008588Sgblack@eecs.umich.edu 49: lfsu({{ Ft_sf = Mem_sf; }}); 5018588Sgblack@eecs.umich.edu 51: lfdu({{ Ft = Mem_df; }}); 5026691Stjones1@inf.ed.ac.uk } 5036691Stjones1@inf.ed.ac.uk 5046691Stjones1@inf.ed.ac.uk format StoreDispOp { 5058588Sgblack@eecs.umich.edu 38: stb({{ Mem_ub = Rs_ub; }}); 5068588Sgblack@eecs.umich.edu 44: sth({{ Mem_uh = Rs_uh; }}); 5076691Stjones1@inf.ed.ac.uk 36: stw({{ Mem = Rs; }}); 5088588Sgblack@eecs.umich.edu 52: stfs({{ Mem_sf = Fs_sf; }}); 5098588Sgblack@eecs.umich.edu 54: stfd({{ Mem_df = Fs; }}); 5106691Stjones1@inf.ed.ac.uk } 5116691Stjones1@inf.ed.ac.uk 5126691Stjones1@inf.ed.ac.uk format StoreDispUpdateOp { 5138588Sgblack@eecs.umich.edu 39: stbu({{ Mem_ub = Rs_ub; }}); 5148588Sgblack@eecs.umich.edu 45: sthu({{ Mem_uh = Rs_uh; }}); 5156691Stjones1@inf.ed.ac.uk 37: stwu({{ Mem = Rs; }}); 5168588Sgblack@eecs.umich.edu 53: stfsu({{ Mem_sf = Fs_sf; }}); 5178588Sgblack@eecs.umich.edu 55: stfdu({{ Mem_df = Fs; }}); 5186691Stjones1@inf.ed.ac.uk } 5196691Stjones1@inf.ed.ac.uk 52011877Sbrandon.potter@amd.com 17: IntOp::sc({{ xc->syscall(R0, &fault); }}, 5216691Stjones1@inf.ed.ac.uk [ IsSyscall, IsNonSpeculative, IsSerializeAfter ]); 5226691Stjones1@inf.ed.ac.uk 5236691Stjones1@inf.ed.ac.uk format FloatArithOp { 5246691Stjones1@inf.ed.ac.uk 59: decode A_XO { 5256691Stjones1@inf.ed.ac.uk 21: fadds({{ Ft = Fa + Fb; }}); 5266691Stjones1@inf.ed.ac.uk 20: fsubs({{ Ft = Fa - Fb; }}); 5276691Stjones1@inf.ed.ac.uk 25: fmuls({{ Ft = Fa * Fc; }}); 5286691Stjones1@inf.ed.ac.uk 18: fdivs({{ Ft = Fa / Fb; }}); 5296691Stjones1@inf.ed.ac.uk 29: fmadds({{ Ft = (Fa * Fc) + Fb; }}); 5306691Stjones1@inf.ed.ac.uk 28: fmsubs({{ Ft = (Fa * Fc) - Fb; }}); 5316691Stjones1@inf.ed.ac.uk 31: fnmadds({{ Ft = -((Fa * Fc) + Fb); }}); 5326691Stjones1@inf.ed.ac.uk 30: fnmsubs({{ Ft = -((Fa * Fc) - Fb); }}); 5336691Stjones1@inf.ed.ac.uk } 5346691Stjones1@inf.ed.ac.uk } 5356691Stjones1@inf.ed.ac.uk 5366691Stjones1@inf.ed.ac.uk 63: decode A_XO { 5376691Stjones1@inf.ed.ac.uk format FloatArithOp { 5386691Stjones1@inf.ed.ac.uk 21: fadd({{ Ft = Fa + Fb; }}); 5396691Stjones1@inf.ed.ac.uk 20: fsub({{ Ft = Fa - Fb; }}); 5406691Stjones1@inf.ed.ac.uk 25: fmul({{ Ft = Fa * Fc; }}); 5416691Stjones1@inf.ed.ac.uk 18: fdiv({{ Ft = Fa / Fb; }}); 5426691Stjones1@inf.ed.ac.uk 29: fmadd({{ Ft = (Fa * Fc) + Fb; }}); 5436691Stjones1@inf.ed.ac.uk 28: fmsub({{ Ft = (Fa * Fc) - Fb; }}); 5446691Stjones1@inf.ed.ac.uk 31: fnmadd({{ Ft = -((Fa * Fc) + Fb); }}); 5456691Stjones1@inf.ed.ac.uk 30: fnmsub({{ Ft = -((Fa * Fc) - Fb); }}); 5466691Stjones1@inf.ed.ac.uk } 5476691Stjones1@inf.ed.ac.uk 5486691Stjones1@inf.ed.ac.uk default: decode XO_XO { 5496691Stjones1@inf.ed.ac.uk format FloatConvertOp { 5508588Sgblack@eecs.umich.edu 12: frsp({{ Ft_sf = Fb; }}); 5518588Sgblack@eecs.umich.edu 15: fctiwz({{ Ft_sw = (int32_t)trunc(Fb); }}); 5526691Stjones1@inf.ed.ac.uk } 5536691Stjones1@inf.ed.ac.uk 5546691Stjones1@inf.ed.ac.uk format FloatOp { 5556691Stjones1@inf.ed.ac.uk 0: fcmpu({{ 5566691Stjones1@inf.ed.ac.uk uint32_t c = makeCRField(Fa, Fb); 5576691Stjones1@inf.ed.ac.uk Fpscr fpscr = FPSCR; 5586691Stjones1@inf.ed.ac.uk fpscr.fprf.fpcc = c; 5596691Stjones1@inf.ed.ac.uk FPSCR = fpscr; 5606691Stjones1@inf.ed.ac.uk CR = insertCRField(CR, BF, c); 5616691Stjones1@inf.ed.ac.uk }}); 5626691Stjones1@inf.ed.ac.uk } 5636691Stjones1@inf.ed.ac.uk 5646691Stjones1@inf.ed.ac.uk format FloatRCCheckOp { 5656691Stjones1@inf.ed.ac.uk 72: fmr({{ Ft = Fb; }}); 5666691Stjones1@inf.ed.ac.uk 264: fabs({{ 56713800Ssandipan@linux.ibm.com Ft_ud = Fb_ud; 56813800Ssandipan@linux.ibm.com Ft_ud = insertBits(Ft_ud, 63, 0); }}); 5696691Stjones1@inf.ed.ac.uk 136: fnabs({{ 57013800Ssandipan@linux.ibm.com Ft_ud = Fb_ud; 57113800Ssandipan@linux.ibm.com Ft_ud = insertBits(Ft_ud, 63, 1); }}); 5726691Stjones1@inf.ed.ac.uk 40: fneg({{ Ft = -Fb; }}); 5736691Stjones1@inf.ed.ac.uk 8: fcpsgn({{ 57413800Ssandipan@linux.ibm.com Ft_ud = Fb_ud; 57513800Ssandipan@linux.ibm.com Ft_ud = insertBits(Ft_ud, 63, Fa_ud<63:63>); 5766691Stjones1@inf.ed.ac.uk }}); 57713800Ssandipan@linux.ibm.com 583: mffs({{ Ft_ud = FPSCR; }}); 5786691Stjones1@inf.ed.ac.uk 134: mtfsfi({{ 5798917Sandreas.hansson@arm.com FPSCR = insertCRField(FPSCR, BF + (8 * (1 - W_FIELD)), 5808917Sandreas.hansson@arm.com U_FIELD); 5816691Stjones1@inf.ed.ac.uk }}); 5826691Stjones1@inf.ed.ac.uk 711: mtfsf({{ 58313800Ssandipan@linux.ibm.com if (L_FIELD == 1) { FPSCR = Fb_ud; } 5846691Stjones1@inf.ed.ac.uk else { 5856691Stjones1@inf.ed.ac.uk for (int i = 0; i < 8; ++i) { 5866691Stjones1@inf.ed.ac.uk if (bits(FLM, i) == 1) { 5878917Sandreas.hansson@arm.com int k = 4 * (i + (8 * (1 - W_FIELD))); 58812692Smattdsinclair@gmail.com FPSCR = insertBits(FPSCR, k + 3, k, 58913800Ssandipan@linux.ibm.com bits(Fb_ud, k + 3, k)); 5906691Stjones1@inf.ed.ac.uk } 5916691Stjones1@inf.ed.ac.uk } 5926691Stjones1@inf.ed.ac.uk } 5936691Stjones1@inf.ed.ac.uk }}); 5946691Stjones1@inf.ed.ac.uk 70: mtfsb0({{ FPSCR = insertBits(FPSCR, 31 - BT, 0); }}); 5956691Stjones1@inf.ed.ac.uk 38: mtfsb1({{ FPSCR = insertBits(FPSCR, 31 - BT, 1); }}); 5966691Stjones1@inf.ed.ac.uk } 5976691Stjones1@inf.ed.ac.uk } 5986691Stjones1@inf.ed.ac.uk } 5996691Stjones1@inf.ed.ac.uk} 600