OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 } | 427 } |
428 | 428 |
429 | 429 |
430 void Assembler::target_at_put(int pos, int target_pos) { | 430 void Assembler::target_at_put(int pos, int target_pos) { |
431 Instr instr = instr_at(pos); | 431 Instr instr = instr_at(pos); |
432 int opcode = instr & kOpcodeMask; | 432 int opcode = instr & kOpcodeMask; |
433 | 433 |
434 switch (opcode) { | 434 switch (opcode) { |
435 case BX: { | 435 case BX: { |
436 int imm26 = target_pos - pos; | 436 int imm26 = target_pos - pos; |
437 DCHECK(is_int26(imm26) && (imm26 & (kAAMask | kLKMask)) == 0); | 437 CHECK(is_int26(imm26) && (imm26 & (kAAMask | kLKMask)) == 0); |
438 if (imm26 == kInstrSize && !(instr & kLKMask)) { | 438 if (imm26 == kInstrSize && !(instr & kLKMask)) { |
439 // Branch to next instr without link. | 439 // Branch to next instr without link. |
440 instr = ORI; // nop: ori, 0,0,0 | 440 instr = ORI; // nop: ori, 0,0,0 |
441 } else { | 441 } else { |
442 instr &= ((~kImm26Mask) | kAAMask | kLKMask); | 442 instr &= ((~kImm26Mask) | kAAMask | kLKMask); |
443 instr |= (imm26 & kImm26Mask); | 443 instr |= (imm26 & kImm26Mask); |
444 } | 444 } |
445 instr_at_put(pos, instr); | 445 instr_at_put(pos, instr); |
446 break; | 446 break; |
447 } | 447 } |
448 case BCX: { | 448 case BCX: { |
449 int imm16 = target_pos - pos; | 449 int imm16 = target_pos - pos; |
450 DCHECK(is_int16(imm16) && (imm16 & (kAAMask | kLKMask)) == 0); | 450 CHECK(is_int16(imm16) && (imm16 & (kAAMask | kLKMask)) == 0); |
451 if (imm16 == kInstrSize && !(instr & kLKMask)) { | 451 if (imm16 == kInstrSize && !(instr & kLKMask)) { |
452 // Branch to next instr without link. | 452 // Branch to next instr without link. |
453 instr = ORI; // nop: ori, 0,0,0 | 453 instr = ORI; // nop: ori, 0,0,0 |
454 } else { | 454 } else { |
455 instr &= ((~kImm16Mask) | kAAMask | kLKMask); | 455 instr &= ((~kImm16Mask) | kAAMask | kLKMask); |
456 instr |= (imm16 & kImm16Mask); | 456 instr |= (imm16 & kImm16Mask); |
457 } | 457 } |
458 instr_at_put(pos, instr); | 458 instr_at_put(pos, instr); |
459 break; | 459 break; |
460 } | 460 } |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 emit(instr | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | r); | 591 emit(instr | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | r); |
592 } | 592 } |
593 | 593 |
594 | 594 |
595 void Assembler::d_form(Instr instr, Register rt, Register ra, | 595 void Assembler::d_form(Instr instr, Register rt, Register ra, |
596 const intptr_t val, bool signed_disp) { | 596 const intptr_t val, bool signed_disp) { |
597 if (signed_disp) { | 597 if (signed_disp) { |
598 if (!is_int16(val)) { | 598 if (!is_int16(val)) { |
599 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR "\n", val, val); | 599 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR "\n", val, val); |
600 } | 600 } |
601 DCHECK(is_int16(val)); | 601 CHECK(is_int16(val)); |
602 } else { | 602 } else { |
603 if (!is_uint16(val)) { | 603 if (!is_uint16(val)) { |
604 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR | 604 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR |
605 ", is_unsigned_imm16(val)=%d, kImm16Mask=0x%x\n", | 605 ", is_unsigned_imm16(val)=%d, kImm16Mask=0x%x\n", |
606 val, val, is_uint16(val), kImm16Mask); | 606 val, val, is_uint16(val), kImm16Mask); |
607 } | 607 } |
608 DCHECK(is_uint16(val)); | 608 CHECK(is_uint16(val)); |
609 } | 609 } |
610 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); | 610 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); |
611 } | 611 } |
612 | 612 |
613 | 613 |
614 void Assembler::x_form(Instr instr, Register ra, Register rs, Register rb, | 614 void Assembler::x_form(Instr instr, Register ra, Register rs, Register rb, |
615 RCBit r) { | 615 RCBit r) { |
616 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); | 616 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); |
617 } | 617 } |
618 | 618 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 void Assembler::bctr() { bcctr(BA, LeaveLK); } | 708 void Assembler::bctr() { bcctr(BA, LeaveLK); } |
709 | 709 |
710 | 710 |
711 void Assembler::bctrl() { bcctr(BA, SetLK); } | 711 void Assembler::bctrl() { bcctr(BA, SetLK); } |
712 | 712 |
713 | 713 |
714 void Assembler::bc(int branch_offset, BOfield bo, int condition_bit, LKBit lk) { | 714 void Assembler::bc(int branch_offset, BOfield bo, int condition_bit, LKBit lk) { |
715 if (lk == SetLK) { | 715 if (lk == SetLK) { |
716 positions_recorder()->WriteRecordedPositions(); | 716 positions_recorder()->WriteRecordedPositions(); |
717 } | 717 } |
718 DCHECK(is_int16(branch_offset)); | 718 int imm16 = branch_offset; |
719 emit(BCX | bo | condition_bit * B16 | (kImm16Mask & branch_offset) | lk); | 719 CHECK(is_int16(imm16) && (imm16 & (kAAMask | kLKMask)) == 0); |
| 720 emit(BCX | bo | condition_bit * B16 | (imm16 & kImm16Mask) | lk); |
720 } | 721 } |
721 | 722 |
722 | 723 |
723 void Assembler::b(int branch_offset, LKBit lk) { | 724 void Assembler::b(int branch_offset, LKBit lk) { |
724 if (lk == SetLK) { | 725 if (lk == SetLK) { |
725 positions_recorder()->WriteRecordedPositions(); | 726 positions_recorder()->WriteRecordedPositions(); |
726 } | 727 } |
727 DCHECK((branch_offset & 3) == 0); | |
728 int imm26 = branch_offset; | 728 int imm26 = branch_offset; |
729 DCHECK(is_int26(imm26)); | 729 CHECK(is_int26(imm26) && (imm26 & (kAAMask | kLKMask)) == 0); |
730 // todo add AA and LK bits | |
731 emit(BX | (imm26 & kImm26Mask) | lk); | 730 emit(BX | (imm26 & kImm26Mask) | lk); |
732 } | 731 } |
733 | 732 |
734 | 733 |
735 void Assembler::xori(Register dst, Register src, const Operand& imm) { | 734 void Assembler::xori(Register dst, Register src, const Operand& imm) { |
736 d_form(XORI, src, dst, imm.imm_, false); | 735 d_form(XORI, src, dst, imm.imm_, false); |
737 } | 736 } |
738 | 737 |
739 | 738 |
740 void Assembler::xoris(Register ra, Register rs, const Operand& imm) { | 739 void Assembler::xoris(Register ra, Register rs, const Operand& imm) { |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1185 void Assembler::lha(Register dst, const MemOperand& src) { | 1184 void Assembler::lha(Register dst, const MemOperand& src) { |
1186 DCHECK(!src.ra_.is(r0)); | 1185 DCHECK(!src.ra_.is(r0)); |
1187 d_form(LHA, dst, src.ra(), src.offset(), true); | 1186 d_form(LHA, dst, src.ra(), src.offset(), true); |
1188 } | 1187 } |
1189 | 1188 |
1190 | 1189 |
1191 void Assembler::lwa(Register dst, const MemOperand& src) { | 1190 void Assembler::lwa(Register dst, const MemOperand& src) { |
1192 #if V8_TARGET_ARCH_PPC64 | 1191 #if V8_TARGET_ARCH_PPC64 |
1193 int offset = src.offset(); | 1192 int offset = src.offset(); |
1194 DCHECK(!src.ra_.is(r0)); | 1193 DCHECK(!src.ra_.is(r0)); |
1195 DCHECK(!(offset & 3) && is_int16(offset)); | 1194 CHECK(!(offset & 3) && is_int16(offset)); |
1196 offset = kImm16Mask & offset; | 1195 offset = kImm16Mask & offset; |
1197 emit(LD | dst.code() * B21 | src.ra().code() * B16 | offset | 2); | 1196 emit(LD | dst.code() * B21 | src.ra().code() * B16 | offset | 2); |
1198 #else | 1197 #else |
1199 lwz(dst, src); | 1198 lwz(dst, src); |
1200 #endif | 1199 #endif |
1201 } | 1200 } |
1202 | 1201 |
1203 | 1202 |
1204 void Assembler::lwax(Register rt, const MemOperand& src) { | 1203 void Assembler::lwax(Register rt, const MemOperand& src) { |
1205 #if V8_TARGET_ARCH_PPC64 | 1204 #if V8_TARGET_ARCH_PPC64 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1319 void Assembler::andc(Register dst, Register src1, Register src2, RCBit rc) { | 1318 void Assembler::andc(Register dst, Register src1, Register src2, RCBit rc) { |
1320 x_form(EXT2 | ANDCX, dst, src1, src2, rc); | 1319 x_form(EXT2 | ANDCX, dst, src1, src2, rc); |
1321 } | 1320 } |
1322 | 1321 |
1323 | 1322 |
1324 #if V8_TARGET_ARCH_PPC64 | 1323 #if V8_TARGET_ARCH_PPC64 |
1325 // 64bit specific instructions | 1324 // 64bit specific instructions |
1326 void Assembler::ld(Register rd, const MemOperand& src) { | 1325 void Assembler::ld(Register rd, const MemOperand& src) { |
1327 int offset = src.offset(); | 1326 int offset = src.offset(); |
1328 DCHECK(!src.ra_.is(r0)); | 1327 DCHECK(!src.ra_.is(r0)); |
1329 DCHECK(!(offset & 3) && is_int16(offset)); | 1328 CHECK(!(offset & 3) && is_int16(offset)); |
1330 offset = kImm16Mask & offset; | 1329 offset = kImm16Mask & offset; |
1331 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset); | 1330 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset); |
1332 } | 1331 } |
1333 | 1332 |
1334 | 1333 |
1335 void Assembler::ldx(Register rd, const MemOperand& src) { | 1334 void Assembler::ldx(Register rd, const MemOperand& src) { |
1336 Register ra = src.ra(); | 1335 Register ra = src.ra(); |
1337 Register rb = src.rb(); | 1336 Register rb = src.rb(); |
1338 DCHECK(!ra.is(r0)); | 1337 DCHECK(!ra.is(r0)); |
1339 emit(EXT2 | LDX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); | 1338 emit(EXT2 | LDX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); |
1340 } | 1339 } |
1341 | 1340 |
1342 | 1341 |
1343 void Assembler::ldu(Register rd, const MemOperand& src) { | 1342 void Assembler::ldu(Register rd, const MemOperand& src) { |
1344 int offset = src.offset(); | 1343 int offset = src.offset(); |
1345 DCHECK(!src.ra_.is(r0)); | 1344 DCHECK(!src.ra_.is(r0)); |
1346 DCHECK(!(offset & 3) && is_int16(offset)); | 1345 CHECK(!(offset & 3) && is_int16(offset)); |
1347 offset = kImm16Mask & offset; | 1346 offset = kImm16Mask & offset; |
1348 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset | 1); | 1347 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset | 1); |
1349 } | 1348 } |
1350 | 1349 |
1351 | 1350 |
1352 void Assembler::ldux(Register rd, const MemOperand& src) { | 1351 void Assembler::ldux(Register rd, const MemOperand& src) { |
1353 Register ra = src.ra(); | 1352 Register ra = src.ra(); |
1354 Register rb = src.rb(); | 1353 Register rb = src.rb(); |
1355 DCHECK(!ra.is(r0)); | 1354 DCHECK(!ra.is(r0)); |
1356 emit(EXT2 | LDUX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); | 1355 emit(EXT2 | LDUX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); |
1357 } | 1356 } |
1358 | 1357 |
1359 | 1358 |
1360 void Assembler::std(Register rs, const MemOperand& src) { | 1359 void Assembler::std(Register rs, const MemOperand& src) { |
1361 int offset = src.offset(); | 1360 int offset = src.offset(); |
1362 DCHECK(!src.ra_.is(r0)); | 1361 DCHECK(!src.ra_.is(r0)); |
1363 DCHECK(!(offset & 3) && is_int16(offset)); | 1362 CHECK(!(offset & 3) && is_int16(offset)); |
1364 offset = kImm16Mask & offset; | 1363 offset = kImm16Mask & offset; |
1365 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset); | 1364 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset); |
1366 } | 1365 } |
1367 | 1366 |
1368 | 1367 |
1369 void Assembler::stdx(Register rs, const MemOperand& src) { | 1368 void Assembler::stdx(Register rs, const MemOperand& src) { |
1370 Register ra = src.ra(); | 1369 Register ra = src.ra(); |
1371 Register rb = src.rb(); | 1370 Register rb = src.rb(); |
1372 DCHECK(!ra.is(r0)); | 1371 DCHECK(!ra.is(r0)); |
1373 emit(EXT2 | STDX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); | 1372 emit(EXT2 | STDX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); |
1374 } | 1373 } |
1375 | 1374 |
1376 | 1375 |
1377 void Assembler::stdu(Register rs, const MemOperand& src) { | 1376 void Assembler::stdu(Register rs, const MemOperand& src) { |
1378 int offset = src.offset(); | 1377 int offset = src.offset(); |
1379 DCHECK(!src.ra_.is(r0)); | 1378 DCHECK(!src.ra_.is(r0)); |
1380 DCHECK(!(offset & 3) && is_int16(offset)); | 1379 CHECK(!(offset & 3) && is_int16(offset)); |
1381 offset = kImm16Mask & offset; | 1380 offset = kImm16Mask & offset; |
1382 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset | 1); | 1381 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset | 1); |
1383 } | 1382 } |
1384 | 1383 |
1385 | 1384 |
1386 void Assembler::stdux(Register rs, const MemOperand& src) { | 1385 void Assembler::stdux(Register rs, const MemOperand& src) { |
1387 Register ra = src.ra(); | 1386 Register ra = src.ra(); |
1388 Register rb = src.rb(); | 1387 Register rb = src.rb(); |
1389 DCHECK(!ra.is(r0)); | 1388 DCHECK(!ra.is(r0)); |
1390 emit(EXT2 | STDUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); | 1389 emit(EXT2 | STDUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 | 1920 |
1922 void Assembler::isync() { emit(EXT1 | ISYNC); } | 1921 void Assembler::isync() { emit(EXT1 | ISYNC); } |
1923 | 1922 |
1924 | 1923 |
1925 // Floating point support | 1924 // Floating point support |
1926 | 1925 |
1927 void Assembler::lfd(const DoubleRegister frt, const MemOperand& src) { | 1926 void Assembler::lfd(const DoubleRegister frt, const MemOperand& src) { |
1928 int offset = src.offset(); | 1927 int offset = src.offset(); |
1929 Register ra = src.ra(); | 1928 Register ra = src.ra(); |
1930 DCHECK(!ra.is(r0)); | 1929 DCHECK(!ra.is(r0)); |
1931 DCHECK(is_int16(offset)); | 1930 CHECK(is_int16(offset)); |
1932 int imm16 = offset & kImm16Mask; | 1931 int imm16 = offset & kImm16Mask; |
1933 // could be x_form instruction with some casting magic | 1932 // could be x_form instruction with some casting magic |
1934 emit(LFD | frt.code() * B21 | ra.code() * B16 | imm16); | 1933 emit(LFD | frt.code() * B21 | ra.code() * B16 | imm16); |
1935 } | 1934 } |
1936 | 1935 |
1937 | 1936 |
1938 void Assembler::lfdu(const DoubleRegister frt, const MemOperand& src) { | 1937 void Assembler::lfdu(const DoubleRegister frt, const MemOperand& src) { |
1939 int offset = src.offset(); | 1938 int offset = src.offset(); |
1940 Register ra = src.ra(); | 1939 Register ra = src.ra(); |
1941 DCHECK(!ra.is(r0)); | 1940 DCHECK(!ra.is(r0)); |
1942 DCHECK(is_int16(offset)); | 1941 CHECK(is_int16(offset)); |
1943 int imm16 = offset & kImm16Mask; | 1942 int imm16 = offset & kImm16Mask; |
1944 // could be x_form instruction with some casting magic | 1943 // could be x_form instruction with some casting magic |
1945 emit(LFDU | frt.code() * B21 | ra.code() * B16 | imm16); | 1944 emit(LFDU | frt.code() * B21 | ra.code() * B16 | imm16); |
1946 } | 1945 } |
1947 | 1946 |
1948 | 1947 |
1949 void Assembler::lfdx(const DoubleRegister frt, const MemOperand& src) { | 1948 void Assembler::lfdx(const DoubleRegister frt, const MemOperand& src) { |
1950 Register ra = src.ra(); | 1949 Register ra = src.ra(); |
1951 Register rb = src.rb(); | 1950 Register rb = src.rb(); |
1952 DCHECK(!ra.is(r0)); | 1951 DCHECK(!ra.is(r0)); |
1953 emit(EXT2 | LFDX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 1952 emit(EXT2 | LFDX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
1954 LeaveRC); | 1953 LeaveRC); |
1955 } | 1954 } |
1956 | 1955 |
1957 | 1956 |
1958 void Assembler::lfdux(const DoubleRegister frt, const MemOperand& src) { | 1957 void Assembler::lfdux(const DoubleRegister frt, const MemOperand& src) { |
1959 Register ra = src.ra(); | 1958 Register ra = src.ra(); |
1960 Register rb = src.rb(); | 1959 Register rb = src.rb(); |
1961 DCHECK(!ra.is(r0)); | 1960 DCHECK(!ra.is(r0)); |
1962 emit(EXT2 | LFDUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 1961 emit(EXT2 | LFDUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
1963 LeaveRC); | 1962 LeaveRC); |
1964 } | 1963 } |
1965 | 1964 |
1966 | 1965 |
1967 void Assembler::lfs(const DoubleRegister frt, const MemOperand& src) { | 1966 void Assembler::lfs(const DoubleRegister frt, const MemOperand& src) { |
1968 int offset = src.offset(); | 1967 int offset = src.offset(); |
1969 Register ra = src.ra(); | 1968 Register ra = src.ra(); |
1970 DCHECK(is_int16(offset)); | 1969 CHECK(is_int16(offset)); |
1971 DCHECK(!ra.is(r0)); | 1970 DCHECK(!ra.is(r0)); |
1972 int imm16 = offset & kImm16Mask; | 1971 int imm16 = offset & kImm16Mask; |
1973 // could be x_form instruction with some casting magic | 1972 // could be x_form instruction with some casting magic |
1974 emit(LFS | frt.code() * B21 | ra.code() * B16 | imm16); | 1973 emit(LFS | frt.code() * B21 | ra.code() * B16 | imm16); |
1975 } | 1974 } |
1976 | 1975 |
1977 | 1976 |
1978 void Assembler::lfsu(const DoubleRegister frt, const MemOperand& src) { | 1977 void Assembler::lfsu(const DoubleRegister frt, const MemOperand& src) { |
1979 int offset = src.offset(); | 1978 int offset = src.offset(); |
1980 Register ra = src.ra(); | 1979 Register ra = src.ra(); |
1981 DCHECK(is_int16(offset)); | 1980 CHECK(is_int16(offset)); |
1982 DCHECK(!ra.is(r0)); | 1981 DCHECK(!ra.is(r0)); |
1983 int imm16 = offset & kImm16Mask; | 1982 int imm16 = offset & kImm16Mask; |
1984 // could be x_form instruction with some casting magic | 1983 // could be x_form instruction with some casting magic |
1985 emit(LFSU | frt.code() * B21 | ra.code() * B16 | imm16); | 1984 emit(LFSU | frt.code() * B21 | ra.code() * B16 | imm16); |
1986 } | 1985 } |
1987 | 1986 |
1988 | 1987 |
1989 void Assembler::lfsx(const DoubleRegister frt, const MemOperand& src) { | 1988 void Assembler::lfsx(const DoubleRegister frt, const MemOperand& src) { |
1990 Register ra = src.ra(); | 1989 Register ra = src.ra(); |
1991 Register rb = src.rb(); | 1990 Register rb = src.rb(); |
1992 DCHECK(!ra.is(r0)); | 1991 DCHECK(!ra.is(r0)); |
1993 emit(EXT2 | LFSX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 1992 emit(EXT2 | LFSX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
1994 LeaveRC); | 1993 LeaveRC); |
1995 } | 1994 } |
1996 | 1995 |
1997 | 1996 |
1998 void Assembler::lfsux(const DoubleRegister frt, const MemOperand& src) { | 1997 void Assembler::lfsux(const DoubleRegister frt, const MemOperand& src) { |
1999 Register ra = src.ra(); | 1998 Register ra = src.ra(); |
2000 Register rb = src.rb(); | 1999 Register rb = src.rb(); |
2001 DCHECK(!ra.is(r0)); | 2000 DCHECK(!ra.is(r0)); |
2002 emit(EXT2 | LFSUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 2001 emit(EXT2 | LFSUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
2003 LeaveRC); | 2002 LeaveRC); |
2004 } | 2003 } |
2005 | 2004 |
2006 | 2005 |
2007 void Assembler::stfd(const DoubleRegister frs, const MemOperand& src) { | 2006 void Assembler::stfd(const DoubleRegister frs, const MemOperand& src) { |
2008 int offset = src.offset(); | 2007 int offset = src.offset(); |
2009 Register ra = src.ra(); | 2008 Register ra = src.ra(); |
2010 DCHECK(is_int16(offset)); | 2009 CHECK(is_int16(offset)); |
2011 DCHECK(!ra.is(r0)); | 2010 DCHECK(!ra.is(r0)); |
2012 int imm16 = offset & kImm16Mask; | 2011 int imm16 = offset & kImm16Mask; |
2013 // could be x_form instruction with some casting magic | 2012 // could be x_form instruction with some casting magic |
2014 emit(STFD | frs.code() * B21 | ra.code() * B16 | imm16); | 2013 emit(STFD | frs.code() * B21 | ra.code() * B16 | imm16); |
2015 } | 2014 } |
2016 | 2015 |
2017 | 2016 |
2018 void Assembler::stfdu(const DoubleRegister frs, const MemOperand& src) { | 2017 void Assembler::stfdu(const DoubleRegister frs, const MemOperand& src) { |
2019 int offset = src.offset(); | 2018 int offset = src.offset(); |
2020 Register ra = src.ra(); | 2019 Register ra = src.ra(); |
2021 DCHECK(is_int16(offset)); | 2020 CHECK(is_int16(offset)); |
2022 DCHECK(!ra.is(r0)); | 2021 DCHECK(!ra.is(r0)); |
2023 int imm16 = offset & kImm16Mask; | 2022 int imm16 = offset & kImm16Mask; |
2024 // could be x_form instruction with some casting magic | 2023 // could be x_form instruction with some casting magic |
2025 emit(STFDU | frs.code() * B21 | ra.code() * B16 | imm16); | 2024 emit(STFDU | frs.code() * B21 | ra.code() * B16 | imm16); |
2026 } | 2025 } |
2027 | 2026 |
2028 | 2027 |
2029 void Assembler::stfdx(const DoubleRegister frs, const MemOperand& src) { | 2028 void Assembler::stfdx(const DoubleRegister frs, const MemOperand& src) { |
2030 Register ra = src.ra(); | 2029 Register ra = src.ra(); |
2031 Register rb = src.rb(); | 2030 Register rb = src.rb(); |
2032 DCHECK(!ra.is(r0)); | 2031 DCHECK(!ra.is(r0)); |
2033 emit(EXT2 | STFDX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 2032 emit(EXT2 | STFDX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
2034 LeaveRC); | 2033 LeaveRC); |
2035 } | 2034 } |
2036 | 2035 |
2037 | 2036 |
2038 void Assembler::stfdux(const DoubleRegister frs, const MemOperand& src) { | 2037 void Assembler::stfdux(const DoubleRegister frs, const MemOperand& src) { |
2039 Register ra = src.ra(); | 2038 Register ra = src.ra(); |
2040 Register rb = src.rb(); | 2039 Register rb = src.rb(); |
2041 DCHECK(!ra.is(r0)); | 2040 DCHECK(!ra.is(r0)); |
2042 emit(EXT2 | STFDUX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 2041 emit(EXT2 | STFDUX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
2043 LeaveRC); | 2042 LeaveRC); |
2044 } | 2043 } |
2045 | 2044 |
2046 | 2045 |
2047 void Assembler::stfs(const DoubleRegister frs, const MemOperand& src) { | 2046 void Assembler::stfs(const DoubleRegister frs, const MemOperand& src) { |
2048 int offset = src.offset(); | 2047 int offset = src.offset(); |
2049 Register ra = src.ra(); | 2048 Register ra = src.ra(); |
2050 DCHECK(is_int16(offset)); | 2049 CHECK(is_int16(offset)); |
2051 DCHECK(!ra.is(r0)); | 2050 DCHECK(!ra.is(r0)); |
2052 int imm16 = offset & kImm16Mask; | 2051 int imm16 = offset & kImm16Mask; |
2053 // could be x_form instruction with some casting magic | 2052 // could be x_form instruction with some casting magic |
2054 emit(STFS | frs.code() * B21 | ra.code() * B16 | imm16); | 2053 emit(STFS | frs.code() * B21 | ra.code() * B16 | imm16); |
2055 } | 2054 } |
2056 | 2055 |
2057 | 2056 |
2058 void Assembler::stfsu(const DoubleRegister frs, const MemOperand& src) { | 2057 void Assembler::stfsu(const DoubleRegister frs, const MemOperand& src) { |
2059 int offset = src.offset(); | 2058 int offset = src.offset(); |
2060 Register ra = src.ra(); | 2059 Register ra = src.ra(); |
2061 DCHECK(is_int16(offset)); | 2060 CHECK(is_int16(offset)); |
2062 DCHECK(!ra.is(r0)); | 2061 DCHECK(!ra.is(r0)); |
2063 int imm16 = offset & kImm16Mask; | 2062 int imm16 = offset & kImm16Mask; |
2064 // could be x_form instruction with some casting magic | 2063 // could be x_form instruction with some casting magic |
2065 emit(STFSU | frs.code() * B21 | ra.code() * B16 | imm16); | 2064 emit(STFSU | frs.code() * B21 | ra.code() * B16 | imm16); |
2066 } | 2065 } |
2067 | 2066 |
2068 | 2067 |
2069 void Assembler::stfsx(const DoubleRegister frs, const MemOperand& src) { | 2068 void Assembler::stfsx(const DoubleRegister frs, const MemOperand& src) { |
2070 Register ra = src.ra(); | 2069 Register ra = src.ra(); |
2071 Register rb = src.rb(); | 2070 Register rb = src.rb(); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2447 pc_offset() + kMaxCondBranchReach - kMaxBlockTrampolineSectionSize; | 2446 pc_offset() + kMaxCondBranchReach - kMaxBlockTrampolineSectionSize; |
2448 } | 2447 } |
2449 return; | 2448 return; |
2450 } | 2449 } |
2451 | 2450 |
2452 | 2451 |
2453 } // namespace internal | 2452 } // namespace internal |
2454 } // namespace v8 | 2453 } // namespace v8 |
2455 | 2454 |
2456 #endif // V8_TARGET_ARCH_PPC | 2455 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |